@@ -1053,7 +1053,22 @@ TypeSystemSwiftTypeRef::ResolveTypeAlias(swift::Demangle::Demangler &dem,
1053
1053
}
1054
1054
}
1055
1055
1056
- if (prefer_clang_types || !results.Done (query)) {
1056
+
1057
+ TypeSP type;
1058
+ if (results.Done (query))
1059
+ type = results.GetFirstType ();
1060
+
1061
+ // Find the type by declcontext (-gdwarf-types).
1062
+ if (!type) {
1063
+ auto resolved = DWARFASTParserSwift::ResolveTypeAlias (
1064
+ GetTypeFromMangledTypename (mangled));
1065
+ if (resolved.second ) {
1066
+ NodePointer n = GetDemangledType (dem, resolved.second .GetMangledTypeName ());
1067
+ return {n, {}};
1068
+ }
1069
+ }
1070
+
1071
+ if (prefer_clang_types || !type) {
1057
1072
// No Swift type found -- this could be a Clang typedef. This
1058
1073
// check is not done earlier because a Clang typedef that points
1059
1074
// to a builtin type, e.g., "typedef unsigned uint32_t", could
@@ -1066,7 +1081,6 @@ TypeSystemSwiftTypeRef::ResolveTypeAlias(swift::Demangle::Demangler &dem,
1066
1081
return {{}, clang_type};
1067
1082
}
1068
1083
1069
- TypeSP type = results.GetFirstType ();
1070
1084
if (!type) {
1071
1085
LLDB_LOGF (GetLog (LLDBLog::Types), " Found empty type alias %s" ,
1072
1086
mangled.AsCString ());
@@ -1097,14 +1111,8 @@ TypeSystemSwiftTypeRef::ResolveTypeAlias(swift::Demangle::Demangler &dem,
1097
1111
return {n, {}};
1098
1112
}
1099
1113
1100
- CompilerType
1101
- TypeSystemSwiftTypeRef::GetParentType (lldb::opaque_compiler_type_t type) {
1102
- using namespace swift ::Demangle;
1103
- Demangler dem;
1104
- const char *mangled_typename = AsMangledName (type);
1105
- auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_typename);
1106
- NodePointer node =
1107
- swift_demangle::GetDemangledTypeMangling (dem, mangled_typename);
1114
+ static swift::Demangle::NodePointer
1115
+ GetParentNode (swift::Demangle::NodePointer node) {
1108
1116
if (!node || node->getKind () != Node::Kind::Type || !node->hasChildren ())
1109
1117
return {};
1110
1118
node = node->getChild (0 );
@@ -1125,6 +1133,18 @@ TypeSystemSwiftTypeRef::GetParentType(lldb::opaque_compiler_type_t type) {
1125
1133
default :
1126
1134
break ;
1127
1135
}
1136
+ return parent_node;
1137
+ }
1138
+
1139
+ CompilerType
1140
+ TypeSystemSwiftTypeRef::GetParentType (lldb::opaque_compiler_type_t type) {
1141
+ using namespace swift ::Demangle;
1142
+ Demangler dem;
1143
+ const char *mangled_typename = AsMangledName (type);
1144
+ auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_typename);
1145
+ NodePointer node =
1146
+ swift_demangle::GetDemangledTypeMangling (dem, mangled_typename);
1147
+ NodePointer parent_node = GetParentNode (node);
1128
1148
if (!parent_node) {
1129
1149
LLDB_LOGF (GetLog (LLDBLog::Types), " Could not determine declcontext of %s." ,
1130
1150
mangled_typename);
@@ -1135,6 +1155,71 @@ TypeSystemSwiftTypeRef::GetParentType(lldb::opaque_compiler_type_t type) {
1135
1155
return RemangleAsType (dem, type_node, flavor);
1136
1156
}
1137
1157
1158
+ std::vector<std::vector<CompilerType>>
1159
+ TypeSystemSwiftTypeRef::GetSubstitutions (lldb::opaque_compiler_type_t type) {
1160
+ using namespace swift ::Demangle;
1161
+ Demangler dem;
1162
+ const char *mangled_typename = AsMangledName (type);
1163
+ auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_typename);
1164
+ NodePointer type_node =
1165
+ swift_demangle::GetDemangledTypeMangling (dem, mangled_typename);
1166
+
1167
+ std::vector<std::vector<CompilerType>> all_subs;
1168
+ for (NodePointer node = GetParentNode (type_node); node;
1169
+ node = GetParentNode (node)) {
1170
+ all_subs.push_back ({});
1171
+ std::vector<CompilerType> &subs = all_subs.back ();
1172
+ switch (node->getKind ()) {
1173
+ case Node::Kind::BoundGenericStructure: {
1174
+ if (node->getNumChildren () == 2 ) {
1175
+ if (NodePointer params = node->getChild (1 ))
1176
+ for (NodePointer t : *params) {
1177
+ subs.push_back (RemangleAsType (dem, t, flavor));
1178
+ }
1179
+ }
1180
+ break ;
1181
+ }
1182
+ default :
1183
+ break ;
1184
+ }
1185
+ }
1186
+ return all_subs;
1187
+ }
1188
+
1189
+ CompilerType TypeSystemSwiftTypeRef::ApplySubstitutions (
1190
+ lldb::opaque_compiler_type_t type,
1191
+ std::vector<std::vector<CompilerType>> subs) {
1192
+ using namespace swift ::Demangle;
1193
+ Demangler dem;
1194
+ const char *mangled_typename = AsMangledName (type);
1195
+ auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_typename);
1196
+ NodePointer node =
1197
+ swift_demangle::GetDemangledTypeMangling (dem, mangled_typename);
1198
+
1199
+ node = Transform (dem, node, [&](NodePointer node) {
1200
+ if (!node || node->getKind () != Node::Kind::DependentGenericParamType ||
1201
+ node->getNumChildren () != 2 )
1202
+ return node;
1203
+ NodePointer depth_node = node->getChild (0 );
1204
+ NodePointer index_node = node->getChild (1 );
1205
+ if (!depth_node->hasIndex () || !index_node->hasIndex ())
1206
+ return node;
1207
+ unsigned depth = depth_node->getIndex ();
1208
+ unsigned index = index_node->getIndex ();
1209
+ if (depth >= subs.size ())
1210
+ return node;
1211
+ if (index >= subs[depth].size ())
1212
+ return node;
1213
+ CompilerType sub = subs[depth][index];
1214
+ return swift_demangle::GetDemangledTypeMangling (dem,
1215
+ sub.GetMangledTypeName ());
1216
+ });
1217
+
1218
+ NodePointer type_node = dem.createNode (Node::Kind::Type);
1219
+ type_node->addChild (node, dem);
1220
+ return RemangleAsType (dem, type_node, flavor);
1221
+ }
1222
+
1138
1223
std::optional<TypeSystemSwift::TupleElement>
1139
1224
TypeSystemSwiftTypeRef::GetTupleElement (lldb::opaque_compiler_type_t type,
1140
1225
size_t idx) {
0 commit comments