11
11
// ===----------------------------------------------------------------------===//
12
12
13
13
#include " Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
14
- #include " Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeImpl.h"
15
14
#include " Plugins/TypeSystem/Swift/SwiftASTContext.h"
16
15
#include " Plugins/TypeSystem/Swift/SwiftDWARFImporterForClangTypes.h"
17
16
#include " Plugins/TypeSystem/Swift/SwiftDemangle.h"
@@ -1075,8 +1074,8 @@ TypeSystemSwiftTypeRef::GetTupleElement(lldb::opaque_compiler_type_t type,
1075
1074
using namespace swift ::Demangle;
1076
1075
Demangler dem;
1077
1076
auto flavor = SwiftLanguageRuntime::GetManglingFlavor (AsMangledName (type));
1078
-
1079
- NodePointer node = TypeSystemSwiftTypeRef::DemangleCanonicalType (dem, type);
1077
+ NodePointer node =
1078
+ TypeSystemSwiftTypeRef::DemangleCanonicalOutermostType (dem, type);
1080
1079
if (!node || node->getKind () != Node::Kind::Tuple)
1081
1080
return {};
1082
1081
if (node->getNumChildren () < idx)
@@ -1182,6 +1181,59 @@ Desugar(swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
1182
1181
return desugared;
1183
1182
}
1184
1183
1184
+ swift::Demangle::NodePointer
1185
+ TypeSystemSwiftTypeRef::Canonicalize (swift::Demangle::Demangler &dem,
1186
+ swift::Demangle::NodePointer node,
1187
+ swift::Mangle::ManglingFlavor flavor) {
1188
+ assert (node);
1189
+ auto kind = node->getKind ();
1190
+ switch (kind) {
1191
+ case Node::Kind::SugaredOptional:
1192
+ // FIXME: Factor these three cases out.
1193
+ assert (node->getNumChildren () == 1 );
1194
+ if (node->getNumChildren () != 1 )
1195
+ return node;
1196
+ return Desugar (dem, node, Node::Kind::BoundGenericEnum, Node::Kind::Enum,
1197
+ " Optional" );
1198
+ case Node::Kind::SugaredArray: {
1199
+ assert (node->getNumChildren () == 1 );
1200
+ if (node->getNumChildren () != 1 )
1201
+ return node;
1202
+ return Desugar (dem, node, Node::Kind::BoundGenericStructure,
1203
+ Node::Kind::Structure, " Array" );
1204
+ }
1205
+ case Node::Kind::SugaredDictionary:
1206
+ // FIXME: This isnt covered by any test.
1207
+ assert (node->getNumChildren () == 2 );
1208
+ if (node->getNumChildren () != 2 )
1209
+ return node;
1210
+ return Desugar (dem, node, Node::Kind::BoundGenericStructure,
1211
+ Node::Kind::Structure, " Dictionary" );
1212
+ case Node::Kind::SugaredParen:
1213
+ assert (node->getNumChildren () == 1 );
1214
+ if (node->getNumChildren () != 1 )
1215
+ return node;
1216
+ return node->getFirstChild ();
1217
+
1218
+ case Node::Kind::BoundGenericTypeAlias:
1219
+ case Node::Kind::TypeAlias: {
1220
+ auto node_clangtype = ResolveTypeAlias (dem, node, flavor);
1221
+ if (CompilerType clang_type = node_clangtype.second ) {
1222
+ if (auto result = GetClangTypeNode (clang_type, dem))
1223
+ return result;
1224
+ else
1225
+ return node;
1226
+ }
1227
+ if (node_clangtype.first )
1228
+ return node_clangtype.first ;
1229
+ return node;
1230
+ }
1231
+ default :
1232
+ break ;
1233
+ }
1234
+ return node;
1235
+ }
1236
+
1185
1237
// / Iteratively resolve all type aliases in \p node by looking up their
1186
1238
// / desugared types in the debug info of module \p M.
1187
1239
swift::Demangle::NodePointer
@@ -1190,52 +1242,7 @@ TypeSystemSwiftTypeRef::GetCanonicalNode(swift::Demangle::Demangler &dem,
1190
1242
swift::Mangle::ManglingFlavor flavor) {
1191
1243
using namespace swift ::Demangle;
1192
1244
return TypeSystemSwiftTypeRef::Transform (dem, node, [&](NodePointer node) {
1193
- auto kind = node->getKind ();
1194
- switch (kind) {
1195
- case Node::Kind::SugaredOptional:
1196
- // FIXME: Factor these three cases out.
1197
- assert (node->getNumChildren () == 1 );
1198
- if (node->getNumChildren () != 1 )
1199
- return node;
1200
- return Desugar (dem, node, Node::Kind::BoundGenericEnum, Node::Kind::Enum,
1201
- " Optional" );
1202
- case Node::Kind::SugaredArray: {
1203
- assert (node->getNumChildren () == 1 );
1204
- if (node->getNumChildren () != 1 )
1205
- return node;
1206
- return Desugar (dem, node, Node::Kind::BoundGenericStructure,
1207
- Node::Kind::Structure, " Array" );
1208
- }
1209
- case Node::Kind::SugaredDictionary:
1210
- // FIXME: This isnt covered by any test.
1211
- assert (node->getNumChildren () == 2 );
1212
- if (node->getNumChildren () != 2 )
1213
- return node;
1214
- return Desugar (dem, node, Node::Kind::BoundGenericStructure,
1215
- Node::Kind::Structure, " Dictionary" );
1216
- case Node::Kind::SugaredParen:
1217
- assert (node->getNumChildren () == 1 );
1218
- if (node->getNumChildren () != 1 )
1219
- return node;
1220
- return node->getFirstChild ();
1221
-
1222
- case Node::Kind::BoundGenericTypeAlias:
1223
- case Node::Kind::TypeAlias: {
1224
- auto node_clangtype = ResolveTypeAlias (dem, node, flavor);
1225
- if (CompilerType clang_type = node_clangtype.second ) {
1226
- if (auto result = GetClangTypeNode (clang_type, dem))
1227
- return result;
1228
- else
1229
- return node;
1230
- }
1231
- if (node_clangtype.first )
1232
- return node_clangtype.first ;
1233
- return node;
1234
- }
1235
- default :
1236
- break ;
1237
- }
1238
- return node;
1245
+ return Canonicalize (dem, node, flavor);
1239
1246
});
1240
1247
}
1241
1248
@@ -2444,6 +2451,7 @@ template <> bool Equivalent<CompilerType>(CompilerType l, CompilerType r) {
2444
2451
ast_ctx->ReconstructType (l.GetMangledTypeName ()))
2445
2452
.value_or (nullptr )) == r.GetOpaqueQualType ())
2446
2453
return true ;
2454
+
2447
2455
ConstString lhs = l.GetMangledTypeName ();
2448
2456
ConstString rhs = r.GetMangledTypeName ();
2449
2457
if (lhs == ConstString (" $sSiD" ) && rhs == ConstString (" $sSuD" ))
@@ -2719,12 +2727,34 @@ TypeSystemSwiftTypeRef::RemangleAsType(swift::Demangle::Demangler &dem,
2719
2727
}
2720
2728
2721
2729
swift::Demangle::NodePointer TypeSystemSwiftTypeRef::DemangleCanonicalType (
2722
- swift::Demangle::Demangler &dem, opaque_compiler_type_t opaque_type) {
2730
+ swift::Demangle::Demangler &dem, lldb:: opaque_compiler_type_t opaque_type) {
2723
2731
using namespace swift ::Demangle;
2724
2732
CompilerType type = GetCanonicalType (opaque_type);
2725
2733
return GetDemangledType (dem, type.GetMangledTypeName ().GetStringRef ());
2726
2734
}
2727
2735
2736
+ swift::Demangle::NodePointer
2737
+ TypeSystemSwiftTypeRef::DemangleCanonicalOutermostType (
2738
+ swift::Demangle::Demangler &dem, lldb::opaque_compiler_type_t type) {
2739
+ using namespace swift ::Demangle;
2740
+ const auto *mangled_name = AsMangledName (type);
2741
+ auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_name);
2742
+ NodePointer node = GetDemangledType (dem, mangled_name);
2743
+
2744
+ if (!node)
2745
+ return nullptr ;
2746
+ NodePointer canonical = Canonicalize (dem, node, flavor);
2747
+ if (canonical &&
2748
+ canonical->getKind () == swift::Demangle::Node::Kind::TypeAlias) {
2749
+ // If this is a typealias defined in the expression evaluator,
2750
+ // then we don't have debug info to resolve it from.
2751
+ CompilerType ast_type =
2752
+ ReconstructType ({weak_from_this (), type}, nullptr ).GetCanonicalType ();
2753
+ return GetDemangledType (dem, ast_type.GetMangledTypeName ());
2754
+ }
2755
+ return canonical;
2756
+ }
2757
+
2728
2758
CompilerType TypeSystemSwiftTypeRef::CreateGenericTypeParamType (
2729
2759
unsigned int depth, unsigned int index,
2730
2760
swift::Mangle::ManglingFlavor flavor) {
@@ -2754,7 +2784,7 @@ bool TypeSystemSwiftTypeRef::IsArrayType(opaque_compiler_type_t type,
2754
2784
auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_name);
2755
2785
2756
2786
Demangler dem;
2757
- NodePointer node = DemangleCanonicalType (dem, type);
2787
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2758
2788
if (!node || node->getNumChildren () != 2 ||
2759
2789
node->getKind () != Node::Kind::BoundGenericStructure)
2760
2790
return false ;
@@ -2780,7 +2810,9 @@ bool TypeSystemSwiftTypeRef::IsArrayType(opaque_compiler_type_t type,
2780
2810
return false ;
2781
2811
elem_node = elem_node->getFirstChild ();
2782
2812
if (element_type)
2783
- *element_type = RemangleAsType (dem, elem_node, flavor);
2813
+ // FIXME: This expensive canonicalization is only there for
2814
+ // SwiftASTContext compatibility.
2815
+ *element_type = RemangleAsType (dem, elem_node, flavor).GetCanonicalType ();
2784
2816
2785
2817
if (is_incomplete)
2786
2818
*is_incomplete = true ;
@@ -2797,7 +2829,7 @@ bool TypeSystemSwiftTypeRef::IsAggregateType(opaque_compiler_type_t type) {
2797
2829
auto impl = [&]() -> bool {
2798
2830
using namespace swift ::Demangle;
2799
2831
Demangler dem;
2800
- NodePointer node = DemangleCanonicalType (dem, type);
2832
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2801
2833
2802
2834
if (!node)
2803
2835
return false ;
@@ -2835,7 +2867,7 @@ bool TypeSystemSwiftTypeRef::IsFunctionType(opaque_compiler_type_t type) {
2835
2867
auto impl = [&]() -> bool {
2836
2868
using namespace swift ::Demangle;
2837
2869
Demangler dem;
2838
- NodePointer node = DemangleCanonicalType (dem, type);
2870
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2839
2871
// Note: There are a number of other candidates, and this list may need
2840
2872
// updating. Ex: `NoEscapeFunctionType`, `ThinFunctionType`, etc.
2841
2873
return node && (node->getKind () == Node::Kind::FunctionType ||
@@ -2850,7 +2882,7 @@ size_t TypeSystemSwiftTypeRef::GetNumberOfFunctionArguments(
2850
2882
auto impl = [&]() -> size_t {
2851
2883
using namespace swift ::Demangle;
2852
2884
Demangler dem;
2853
- NodePointer node = DemangleCanonicalType (dem, type);
2885
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2854
2886
if (!node || (node->getKind () != Node::Kind::FunctionType &&
2855
2887
node->getKind () != Node::Kind::NoEscapeFunctionType &&
2856
2888
node->getKind () != Node::Kind::ImplFunctionType))
@@ -2884,7 +2916,7 @@ TypeSystemSwiftTypeRef::GetFunctionArgumentAtIndex(opaque_compiler_type_t type,
2884
2916
auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_name);
2885
2917
2886
2918
Demangler dem;
2887
- NodePointer node = DemangleCanonicalType (dem, type);
2919
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2888
2920
if (!node || (node->getKind () != Node::Kind::FunctionType &&
2889
2921
node->getKind () != Node::Kind::NoEscapeFunctionType &&
2890
2922
node->getKind () != Node::Kind::ImplFunctionType))
@@ -3013,7 +3045,7 @@ bool TypeSystemSwiftTypeRef::IsPointerType(opaque_compiler_type_t type,
3013
3045
auto impl = [&]() {
3014
3046
using namespace swift ::Demangle;
3015
3047
Demangler dem;
3016
- NodePointer node = DemangleCanonicalType (dem, type);
3048
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
3017
3049
if (!node || node->getKind () != Node::Kind::BuiltinTypeName ||
3018
3050
!node->hasText ())
3019
3051
return false ;
@@ -3029,7 +3061,7 @@ bool TypeSystemSwiftTypeRef::IsVoidType(opaque_compiler_type_t type) {
3029
3061
auto impl = [&]() {
3030
3062
using namespace swift ::Demangle;
3031
3063
Demangler dem;
3032
- NodePointer node = DemangleCanonicalType (dem, type);
3064
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
3033
3065
return node && node->getNumChildren () == 0 &&
3034
3066
node->getKind () == Node::Kind::Tuple;
3035
3067
};
@@ -3218,7 +3250,7 @@ TypeSystemSwiftTypeRef::GetFunctionReturnType(opaque_compiler_type_t type) {
3218
3250
auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_name);
3219
3251
3220
3252
Demangler dem;
3221
- NodePointer node = DemangleCanonicalType (dem, type);
3253
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
3222
3254
if (!node || (node->getKind () != Node::Kind::FunctionType &&
3223
3255
node->getKind () != Node::Kind::NoEscapeFunctionType &&
3224
3256
node->getKind () != Node::Kind::ImplFunctionType))
@@ -3451,7 +3483,7 @@ lldb::Encoding TypeSystemSwiftTypeRef::GetEncoding(opaque_compiler_type_t type,
3451
3483
3452
3484
using namespace swift ::Demangle;
3453
3485
Demangler dem;
3454
- auto *node = DemangleCanonicalType (dem, type);
3486
+ auto *node = DemangleCanonicalOutermostType (dem, type);
3455
3487
if (!node)
3456
3488
return lldb::eEncodingInvalid;
3457
3489
auto kind = node->getKind ();
@@ -4031,7 +4063,7 @@ TypeSystemSwiftTypeRef::GetNumTemplateArguments(opaque_compiler_type_t type,
4031
4063
auto impl = [&]() -> size_t {
4032
4064
using namespace swift ::Demangle;
4033
4065
Demangler dem;
4034
- NodePointer node = DemangleCanonicalType (dem, type);
4066
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
4035
4067
4036
4068
if (!node)
4037
4069
return 0 ;
@@ -4171,7 +4203,7 @@ bool TypeSystemSwiftTypeRef::IsExistentialType(
4171
4203
lldb::opaque_compiler_type_t type) {
4172
4204
using namespace swift ::Demangle;
4173
4205
Demangler dem;
4174
- NodePointer node = DemangleCanonicalType (dem, type);
4206
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
4175
4207
if (!node || node->getNumChildren () != 1 )
4176
4208
return false ;
4177
4209
switch (node->getKind ()) {
@@ -4198,7 +4230,7 @@ bool TypeSystemSwiftTypeRef::IsErrorType(opaque_compiler_type_t type) {
4198
4230
auto impl = [&]() -> bool {
4199
4231
using namespace swift ::Demangle;
4200
4232
Demangler dem;
4201
- NodePointer protocol_list = DemangleCanonicalType (dem, type);
4233
+ NodePointer protocol_list = DemangleCanonicalOutermostType (dem, type);
4202
4234
if (protocol_list && protocol_list->getKind () == Node::Kind::ProtocolList)
4203
4235
for (auto type_list : *protocol_list)
4204
4236
if (type_list && type_list->getKind () == Node::Kind::TypeList)
@@ -4999,7 +5031,7 @@ bool TypeSystemSwiftTypeRef::IsReferenceType(opaque_compiler_type_t type,
4999
5031
auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_name);
5000
5032
5001
5033
Demangler dem;
5002
- NodePointer node = DemangleCanonicalType (dem, type);
5034
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
5003
5035
if (!node || node->getNumChildren () != 1 ||
5004
5036
node->getKind () != Node::Kind::InOut)
5005
5037
return false ;
@@ -5029,7 +5061,7 @@ TypeSystemSwiftTypeRef::GetGenericArgumentType(opaque_compiler_type_t type,
5029
5061
auto flavor = SwiftLanguageRuntime::GetManglingFlavor (mangled_name);
5030
5062
5031
5063
Demangler dem;
5032
- NodePointer node = DemangleCanonicalType (dem, type);
5064
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
5033
5065
if (!node || node->getNumChildren () != 2 )
5034
5066
return {};
5035
5067
0 commit comments