@@ -1064,7 +1064,7 @@ TypeSystemSwiftTypeRef::GetTupleElement(lldb::opaque_compiler_type_t type,
1064
1064
TupleElement result;
1065
1065
using namespace swift ::Demangle;
1066
1066
Demangler dem;
1067
- NodePointer node = TypeSystemSwiftTypeRef::DemangleCanonicalType (dem, type);
1067
+ NodePointer node = TypeSystemSwiftTypeRef::DemangleCanonicalOutermostType (dem, type);
1068
1068
if (!node || node->getKind () != Node::Kind::Tuple)
1069
1069
return {};
1070
1070
if (node->getNumChildren () < idx)
@@ -1170,60 +1170,66 @@ Desugar(swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
1170
1170
return desugared;
1171
1171
}
1172
1172
1173
+ swift::Demangle::NodePointer
1174
+ TypeSystemSwiftTypeRef::Canonicalize (swift::Demangle::Demangler &dem,
1175
+ swift::Demangle::NodePointer node) {
1176
+ assert (node);
1177
+ auto kind = node->getKind ();
1178
+ switch (kind) {
1179
+ case Node::Kind::SugaredOptional:
1180
+ // FIXME: Factor these three cases out.
1181
+ assert (node->getNumChildren () == 1 );
1182
+ if (node->getNumChildren () != 1 )
1183
+ return node;
1184
+ return Desugar (dem, node, Node::Kind::BoundGenericEnum, Node::Kind::Enum,
1185
+ " Optional" );
1186
+ case Node::Kind::SugaredArray: {
1187
+ assert (node->getNumChildren () == 1 );
1188
+ if (node->getNumChildren () != 1 )
1189
+ return node;
1190
+ return Desugar (dem, node, Node::Kind::BoundGenericStructure,
1191
+ Node::Kind::Structure, " Array" );
1192
+ }
1193
+ case Node::Kind::SugaredDictionary:
1194
+ // FIXME: This isnt covered by any test.
1195
+ assert (node->getNumChildren () == 2 );
1196
+ if (node->getNumChildren () != 2 )
1197
+ return node;
1198
+ return Desugar (dem, node, Node::Kind::BoundGenericStructure,
1199
+ Node::Kind::Structure, " Dictionary" );
1200
+ case Node::Kind::SugaredParen:
1201
+ assert (node->getNumChildren () == 1 );
1202
+ if (node->getNumChildren () != 1 )
1203
+ return node;
1204
+ return node->getFirstChild ();
1205
+
1206
+ case Node::Kind::BoundGenericTypeAlias:
1207
+ case Node::Kind::TypeAlias: {
1208
+ auto node_clangtype = ResolveTypeAlias (dem, node);
1209
+ if (CompilerType clang_type = node_clangtype.second ) {
1210
+ if (auto result = GetClangTypeNode (clang_type, dem))
1211
+ return result;
1212
+ else
1213
+ return node;
1214
+ }
1215
+ if (node_clangtype.first )
1216
+ return node_clangtype.first ;
1217
+ return node;
1218
+ }
1219
+ default :
1220
+ break ;
1221
+ }
1222
+ return node;
1223
+ }
1224
+
1173
1225
// / Iteratively resolve all type aliases in \p node by looking up their
1174
1226
// / desugared types in the debug info of module \p M.
1175
1227
swift::Demangle::NodePointer
1176
1228
TypeSystemSwiftTypeRef::GetCanonicalNode (swift::Demangle::Demangler &dem,
1177
1229
swift::Demangle::NodePointer node) {
1178
1230
using namespace swift ::Demangle;
1179
- return TypeSystemSwiftTypeRef::Transform (dem, node, [&](NodePointer node) {
1180
- auto kind = node->getKind ();
1181
- switch (kind) {
1182
- case Node::Kind::SugaredOptional:
1183
- // FIXME: Factor these three cases out.
1184
- assert (node->getNumChildren () == 1 );
1185
- if (node->getNumChildren () != 1 )
1186
- return node;
1187
- return Desugar (dem, node, Node::Kind::BoundGenericEnum, Node::Kind::Enum,
1188
- " Optional" );
1189
- case Node::Kind::SugaredArray: {
1190
- assert (node->getNumChildren () == 1 );
1191
- if (node->getNumChildren () != 1 )
1192
- return node;
1193
- return Desugar (dem, node, Node::Kind::BoundGenericStructure,
1194
- Node::Kind::Structure, " Array" );
1195
- }
1196
- case Node::Kind::SugaredDictionary:
1197
- // FIXME: This isnt covered by any test.
1198
- assert (node->getNumChildren () == 2 );
1199
- if (node->getNumChildren () != 2 )
1200
- return node;
1201
- return Desugar (dem, node, Node::Kind::BoundGenericStructure,
1202
- Node::Kind::Structure, " Dictionary" );
1203
- case Node::Kind::SugaredParen:
1204
- assert (node->getNumChildren () == 1 );
1205
- if (node->getNumChildren () != 1 )
1206
- return node;
1207
- return node->getFirstChild ();
1208
-
1209
- case Node::Kind::BoundGenericTypeAlias:
1210
- case Node::Kind::TypeAlias: {
1211
- auto node_clangtype = ResolveTypeAlias (dem, node);
1212
- if (CompilerType clang_type = node_clangtype.second ) {
1213
- if (auto result = GetClangTypeNode (clang_type, dem))
1214
- return result;
1215
- else
1216
- return node;
1217
- }
1218
- if (node_clangtype.first )
1219
- return node_clangtype.first ;
1220
- return node;
1221
- }
1222
- default :
1223
- break ;
1224
- }
1225
- return node;
1226
- });
1231
+ return TypeSystemSwiftTypeRef::Transform (
1232
+ dem, node, [&](NodePointer node) { return Canonicalize (dem, node); });
1227
1233
}
1228
1234
1229
1235
// / Return the demangle tree representation of this type's canonical
@@ -2427,6 +2433,7 @@ template <> bool Equivalent<CompilerType>(CompilerType l, CompilerType r) {
2427
2433
ast_ctx->ReconstructType (l.GetMangledTypeName ()))
2428
2434
.value_or (nullptr )) == r.GetOpaqueQualType ())
2429
2435
return true ;
2436
+
2430
2437
ConstString lhs = l.GetMangledTypeName ();
2431
2438
ConstString rhs = r.GetMangledTypeName ();
2432
2439
if (lhs == ConstString (" $sSiD" ) && rhs == ConstString (" $sSuD" ))
@@ -2442,6 +2449,7 @@ template <> bool Equivalent<CompilerType>(CompilerType l, CompilerType r) {
2442
2449
TypeSystemSwiftTypeRef::CanonicalizeSugar (dem, l_node));
2443
2450
auto r_mangling = swift::Demangle::mangleNode (
2444
2451
TypeSystemSwiftTypeRef::CanonicalizeSugar (dem, r_node));
2452
+
2445
2453
if (!l_mangling.isSuccess () || !r_mangling.isSuccess ()) {
2446
2454
llvm::dbgs () << " TypeSystemSwiftTypeRef diverges from SwiftASTContext "
2447
2455
" (mangle error): "
@@ -2705,6 +2713,25 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::DemangleCanonicalType(
2705
2713
return GetDemangledType (dem, type.GetMangledTypeName ().GetStringRef ());
2706
2714
}
2707
2715
2716
+ swift::Demangle::NodePointer
2717
+ TypeSystemSwiftTypeRef::DemangleCanonicalOutermostType (
2718
+ swift::Demangle::Demangler &dem, lldb::opaque_compiler_type_t type) {
2719
+ using namespace swift ::Demangle;
2720
+ NodePointer node = GetDemangledType (dem, AsMangledName (type));
2721
+ if (!node)
2722
+ return nullptr ;
2723
+ NodePointer canonical = Canonicalize (dem, node);
2724
+ if (canonical &&
2725
+ canonical->getKind () == swift::Demangle::Node::Kind::TypeAlias) {
2726
+ // If this is a typealias defined in the expression evaluator,
2727
+ // then we don't have debug info to resolve it from.
2728
+ CompilerType ast_type =
2729
+ ReconstructType ({weak_from_this (), type}, nullptr ).GetCanonicalType ();
2730
+ return GetDemangledType (dem, ast_type.GetMangledTypeName ());
2731
+ }
2732
+ return canonical;
2733
+ }
2734
+
2708
2735
CompilerType
2709
2736
TypeSystemSwiftTypeRef::CreateGenericTypeParamType (unsigned int depth,
2710
2737
unsigned int index) {
@@ -2730,7 +2757,7 @@ bool TypeSystemSwiftTypeRef::IsArrayType(opaque_compiler_type_t type,
2730
2757
auto impl = [&]() {
2731
2758
using namespace swift ::Demangle;
2732
2759
Demangler dem;
2733
- NodePointer node = DemangleCanonicalType (dem, type);
2760
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2734
2761
if (!node || node->getNumChildren () != 2 ||
2735
2762
node->getKind () != Node::Kind::BoundGenericStructure)
2736
2763
return false ;
@@ -2756,7 +2783,9 @@ bool TypeSystemSwiftTypeRef::IsArrayType(opaque_compiler_type_t type,
2756
2783
return false ;
2757
2784
elem_node = elem_node->getFirstChild ();
2758
2785
if (element_type)
2759
- *element_type = RemangleAsType (dem, elem_node);
2786
+ // FIXME: This expensive canonicalization is only there for
2787
+ // SwiftASTContext compatibility.
2788
+ *element_type = RemangleAsType (dem, elem_node).GetCanonicalType ();
2760
2789
2761
2790
if (is_incomplete)
2762
2791
*is_incomplete = true ;
@@ -2773,7 +2802,7 @@ bool TypeSystemSwiftTypeRef::IsAggregateType(opaque_compiler_type_t type) {
2773
2802
auto impl = [&]() -> bool {
2774
2803
using namespace swift ::Demangle;
2775
2804
Demangler dem;
2776
- NodePointer node = DemangleCanonicalType (dem, type);
2805
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2777
2806
2778
2807
if (!node)
2779
2808
return false ;
@@ -2811,7 +2840,7 @@ bool TypeSystemSwiftTypeRef::IsFunctionType(opaque_compiler_type_t type) {
2811
2840
auto impl = [&]() -> bool {
2812
2841
using namespace swift ::Demangle;
2813
2842
Demangler dem;
2814
- NodePointer node = DemangleCanonicalType (dem, type);
2843
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2815
2844
// Note: There are a number of other candidates, and this list may need
2816
2845
// updating. Ex: `NoEscapeFunctionType`, `ThinFunctionType`, etc.
2817
2846
return node && (node->getKind () == Node::Kind::FunctionType ||
@@ -2826,7 +2855,7 @@ size_t TypeSystemSwiftTypeRef::GetNumberOfFunctionArguments(
2826
2855
auto impl = [&]() -> size_t {
2827
2856
using namespace swift ::Demangle;
2828
2857
Demangler dem;
2829
- NodePointer node = DemangleCanonicalType (dem, type);
2858
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2830
2859
if (!node || (node->getKind () != Node::Kind::FunctionType &&
2831
2860
node->getKind () != Node::Kind::NoEscapeFunctionType &&
2832
2861
node->getKind () != Node::Kind::ImplFunctionType))
@@ -2856,7 +2885,7 @@ TypeSystemSwiftTypeRef::GetFunctionArgumentAtIndex(opaque_compiler_type_t type,
2856
2885
auto impl = [&]() -> CompilerType {
2857
2886
using namespace swift ::Demangle;
2858
2887
Demangler dem;
2859
- NodePointer node = DemangleCanonicalType (dem, type);
2888
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2860
2889
if (!node || (node->getKind () != Node::Kind::FunctionType &&
2861
2890
node->getKind () != Node::Kind::NoEscapeFunctionType &&
2862
2891
node->getKind () != Node::Kind::ImplFunctionType))
@@ -2982,7 +3011,7 @@ bool TypeSystemSwiftTypeRef::IsPointerType(opaque_compiler_type_t type,
2982
3011
auto impl = [&]() {
2983
3012
using namespace swift ::Demangle;
2984
3013
Demangler dem;
2985
- NodePointer node = DemangleCanonicalType (dem, type);
3014
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
2986
3015
if (!node || node->getKind () != Node::Kind::BuiltinTypeName ||
2987
3016
!node->hasText ())
2988
3017
return false ;
@@ -2998,7 +3027,7 @@ bool TypeSystemSwiftTypeRef::IsVoidType(opaque_compiler_type_t type) {
2998
3027
auto impl = [&]() {
2999
3028
using namespace swift ::Demangle;
3000
3029
Demangler dem;
3001
- NodePointer node = DemangleCanonicalType (dem, type);
3030
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
3002
3031
return node && node->getNumChildren () == 0 &&
3003
3032
node->getKind () == Node::Kind::Tuple;
3004
3033
};
@@ -3176,7 +3205,7 @@ TypeSystemSwiftTypeRef::GetFunctionReturnType(opaque_compiler_type_t type) {
3176
3205
auto impl = [&]() -> CompilerType {
3177
3206
using namespace swift ::Demangle;
3178
3207
Demangler dem;
3179
- NodePointer node = DemangleCanonicalType (dem, type);
3208
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
3180
3209
if (!node || (node->getKind () != Node::Kind::FunctionType &&
3181
3210
node->getKind () != Node::Kind::NoEscapeFunctionType &&
3182
3211
node->getKind () != Node::Kind::ImplFunctionType))
@@ -3407,7 +3436,7 @@ lldb::Encoding TypeSystemSwiftTypeRef::GetEncoding(opaque_compiler_type_t type,
3407
3436
3408
3437
using namespace swift ::Demangle;
3409
3438
Demangler dem;
3410
- auto *node = DemangleCanonicalType (dem, type);
3439
+ auto *node = DemangleCanonicalOutermostType (dem, type);
3411
3440
if (!node)
3412
3441
return lldb::eEncodingInvalid;
3413
3442
auto kind = node->getKind ();
@@ -3983,7 +4012,7 @@ TypeSystemSwiftTypeRef::GetNumTemplateArguments(opaque_compiler_type_t type,
3983
4012
auto impl = [&]() -> size_t {
3984
4013
using namespace swift ::Demangle;
3985
4014
Demangler dem;
3986
- NodePointer node = DemangleCanonicalType (dem, type);
4015
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
3987
4016
3988
4017
if (!node)
3989
4018
return 0 ;
@@ -4121,7 +4150,7 @@ bool TypeSystemSwiftTypeRef::IsExistentialType(
4121
4150
lldb::opaque_compiler_type_t type) {
4122
4151
using namespace swift ::Demangle;
4123
4152
Demangler dem;
4124
- NodePointer node = DemangleCanonicalType (dem, type);
4153
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
4125
4154
if (!node || node->getNumChildren () != 1 )
4126
4155
return false ;
4127
4156
switch (node->getKind ()) {
@@ -4148,7 +4177,7 @@ bool TypeSystemSwiftTypeRef::IsErrorType(opaque_compiler_type_t type) {
4148
4177
auto impl = [&]() -> bool {
4149
4178
using namespace swift ::Demangle;
4150
4179
Demangler dem;
4151
- NodePointer protocol_list = DemangleCanonicalType (dem, type);
4180
+ NodePointer protocol_list = DemangleCanonicalOutermostType (dem, type);
4152
4181
if (protocol_list && protocol_list->getKind () == Node::Kind::ProtocolList)
4153
4182
for (auto type_list : *protocol_list)
4154
4183
if (type_list && type_list->getKind () == Node::Kind::TypeList)
@@ -4918,7 +4947,7 @@ bool TypeSystemSwiftTypeRef::IsReferenceType(opaque_compiler_type_t type,
4918
4947
auto impl = [&]() {
4919
4948
using namespace swift ::Demangle;
4920
4949
Demangler dem;
4921
- NodePointer node = DemangleCanonicalType (dem, type);
4950
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
4922
4951
if (!node || node->getNumChildren () != 1 ||
4923
4952
node->getKind () != Node::Kind::InOut)
4924
4953
return false ;
@@ -4945,7 +4974,7 @@ TypeSystemSwiftTypeRef::GetGenericArgumentType(opaque_compiler_type_t type,
4945
4974
size_t idx) {
4946
4975
auto impl = [&]() -> CompilerType {
4947
4976
Demangler dem;
4948
- NodePointer node = DemangleCanonicalType (dem, type);
4977
+ NodePointer node = DemangleCanonicalOutermostType (dem, type);
4949
4978
if (!node || node->getNumChildren () != 2 )
4950
4979
return {};
4951
4980
0 commit comments