Skip to content

Commit d0d5fbd

Browse files
committed
ASTDemangler: Introduce new getTypeDeclForMangling()
This will replace getDeclFromMangledSymbolName(). Progress on <rdar://problem/47819208>.
1 parent 8158705 commit d0d5fbd

File tree

16 files changed

+488
-367
lines changed

16 files changed

+488
-367
lines changed

include/swift/AST/ASTDemangler.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,16 @@
3030

3131
namespace swift {
3232

33+
class TypeDecl;
34+
3335
namespace Demangle {
3436

3537
Type getTypeForMangling(ASTContext &ctx,
3638
llvm::StringRef mangling);
3739

40+
TypeDecl *getTypeDeclForMangling(ASTContext &ctx,
41+
llvm::StringRef mangling);
42+
3843
/// An implementation of MetadataReader's BuilderType concept that
3944
/// just finds and builds things in the AST.
4045
class ASTBuilder {
@@ -58,6 +63,8 @@ class ASTBuilder {
5863

5964
Type createBuiltinType(StringRef builtinName, StringRef mangledName);
6065

66+
TypeDecl *createTypeDecl(NodePointer node);
67+
6168
GenericTypeDecl *createTypeDecl(StringRef mangledName, bool &typeAlias);
6269

6370
GenericTypeDecl *createTypeDecl(NodePointer node,

lib/AST/ASTDemangler.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,42 @@ Type swift::Demangle::getTypeForMangling(ASTContext &ctx,
4545
return swift::Demangle::decodeMangledType(builder, node);
4646
}
4747

48+
TypeDecl *swift::Demangle::getTypeDeclForMangling(ASTContext &ctx,
49+
StringRef mangling) {
50+
Demangle::Context Dem;
51+
auto node = Dem.demangleSymbolAsNode(mangling);
52+
if (!node)
53+
return nullptr;
54+
55+
ASTBuilder builder(ctx);
56+
return builder.createTypeDecl(node);
57+
}
58+
59+
TypeDecl *ASTBuilder::createTypeDecl(NodePointer node) {
60+
if (node->getKind() == Node::Kind::Global)
61+
return createTypeDecl(node->getChild(0));
62+
63+
// Special case: associated types are not DeclContexts.
64+
if (node->getKind() == Node::Kind::AssociatedTypeRef) {
65+
if (node->getNumChildren() != 2)
66+
return nullptr;
67+
68+
auto *DC = findDeclContext(node->getChild(0));
69+
auto *proto = dyn_cast_or_null<ProtocolDecl>(DC);
70+
if (proto == nullptr)
71+
return nullptr;
72+
73+
auto name = Ctx.getIdentifier(node->getChild(1)->getText());
74+
auto results = proto->lookupDirect(name);
75+
if (results.size() != 1)
76+
return nullptr;
77+
78+
return dyn_cast<AssociatedTypeDecl>(results[0]);
79+
}
80+
81+
auto *DC = findDeclContext(node);
82+
return dyn_cast_or_null<GenericTypeDecl>(DC);
83+
}
4884

4985
Type
5086
ASTBuilder::createBuiltinType(StringRef builtinName,

test/DebugInfo/DumpDeclFromMangledName.swift

Lines changed: 0 additions & 102 deletions
This file was deleted.

test/DebugInfo/Inputs/decl-reconstr-names.txt

Lines changed: 0 additions & 5 deletions
This file was deleted.

test/TypeDecoder/extensions.swift

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
// RUN: %empty-directory(%t)
22

33
// RUN: %target-build-swift -emit-executable %s -g -o %t/extensions -emit-module
4-
// RUN: sed -ne '/\/\/ *DEMANGLE: /s/\/\/ *DEMANGLE: *//p' < %s > %t/input
5-
// RUN: %lldb-moduleimport-test %t/extensions -type-from-mangled=%t/input | %FileCheck %s
4+
5+
// RUN: sed -ne '/\/\/ *DEMANGLE-TYPE: /s/\/\/ *DEMANGLE-TYPE: *//p' < %s > %t/input
6+
// RUN: %lldb-moduleimport-test %t/extensions -type-from-mangled=%t/input | %FileCheck %s --check-prefix=CHECK-TYPE
7+
8+
// RUN: sed -ne '/\/\/ *DEMANGLE-DECL: /s/\/\/ *DEMANGLE-DECL: *//p' < %s > %t/input
9+
// RUN: %lldb-moduleimport-test %t/extensions -decl-from-mangled=%t/input | %FileCheck %s --check-prefix=CHECK-DECL
610

711
struct Concrete {}
812

@@ -22,11 +26,20 @@ extension Generic where T == Int {
2226
struct Nested2 {}
2327
}
2428

25-
// DEMANGLE: $s10extensions8ConcreteV6NestedVD
26-
// CHECK: Concrete.Nested
29+
// DEMANGLE-TYPE: $s10extensions8ConcreteV6NestedVD
30+
// CHECK-TYPE: Concrete.Nested
31+
32+
// DEMANGLE-TYPE: $s10extensions7GenericVA2A5ProtoRzlE7Nested1Vyx_GD
33+
// CHECK-TYPE: Generic<τ_0_0>.Nested1
34+
35+
// DEMANGLE-TYPE: $s10extensions7GenericVAASiRszlE7Nested2VySi_GD
36+
// CHECK-TYPE: Generic<Int>.Nested2
37+
38+
// DEMANGLE-DECL: $s10extensions8ConcreteV6NestedV
39+
// CHECK-DECL: extensions.(file).Concrete extension.Nested
2740

28-
// DEMANGLE: $s10extensions7GenericVA2A5ProtoRzlE7Nested1Vyx_GD
29-
// CHECK: Generic<τ_0_0>.Nested1
41+
// DEMANGLE-DECL: $s10extensions7GenericVA2A5ProtoRzlE7Nested1V
42+
// CHECK-DECL: extensions.(file).Generic extension.Nested1
3043

31-
// DEMANGLE: $s10extensions7GenericVAASiRszlE7Nested2VySi_GD
32-
// CHECK: Generic<Int>.Nested2
44+
// DEMANGLE-DECL: $s10extensions7GenericVAASiRszlE7Nested2V
45+
// CHECK-DECL: extensions.(file).Generic extension.Nested2

test/TypeDecoder/foreign_types.swift

Lines changed: 73 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
// RUN: %empty-directory(%t)
22

33
// RUN: %target-build-swift -I %S/../ClangImporter/Inputs/custom-modules -I %S/../Inputs/custom-modules -emit-executable -emit-module %s -g -o %t/foreign_types
4-
// RUN: sed -ne '/\/\/ *DEMANGLE: /s/\/\/ *DEMANGLE: *//p' < %s > %t/input
5-
// RUN: %lldb-moduleimport-test-with-sdk %t/foreign_types -type-from-mangled=%t/input | %FileCheck %s
4+
5+
// RUN: sed -ne '/\/\/ *DEMANGLE-TYPE: /s/\/\/ *DEMANGLE-TYPE: *//p' < %s > %t/input
6+
// RUN: %lldb-moduleimport-test-with-sdk %t/foreign_types -type-from-mangled=%t/input | %FileCheck %s --check-prefix=CHECK-TYPE
7+
8+
// RUN: sed -ne '/\/\/ *DEMANGLE-DECL: /s/\/\/ *DEMANGLE-DECL: *//p' < %s > %t/input
9+
// RUN: %lldb-moduleimport-test-with-sdk %t/foreign_types -decl-from-mangled=%t/input | %FileCheck %s --check-prefix=CHECK-DECL
610

711
// REQUIRES: objc_interop
812

@@ -41,51 +45,74 @@ do {
4145
}
4246
*/
4347

44-
// DEMANGLE: $sSo17CCRefrigeratorRefaD
45-
// DEMANGLE: $sSo7MyErrorVD
46-
// DEMANGLE: $sSo7MyErrorLeVD
47-
// DEMANGLE: $sSo14MyRenamedErrorVD
48-
// DEMANGLE: $sSo14MyRenamedErrorLeVD
49-
// DEMANGLE: $sSo12MyMemberEnumVD
50-
// DEMANGLE: $sSo18WrapperByAttributeaD
51-
// DEMANGLE: $sSo7IceCubeVD
52-
// DEMANGLE: $sSo10BlockOfIceaD
53-
// DEMANGLE: $sSo17CCRefrigeratorRefa13foreign_typesE18InternalNestedTypeVD
54-
// DEMANGLE: $sSo17CCRefrigeratorRefa13foreign_typesE17PrivateNestedType33_5415CB6AE6FCD935BF2278A4C9A5F9C3LLVD
48+
// DEMANGLE-TYPE: $sSo17CCRefrigeratorRefaD
49+
// DEMANGLE-TYPE: $sSo7MyErrorVD
50+
// DEMANGLE-TYPE: $sSo7MyErrorLeVD
51+
// DEMANGLE-TYPE: $sSo14MyRenamedErrorVD
52+
// DEMANGLE-TYPE: $sSo14MyRenamedErrorLeVD
53+
// DEMANGLE-TYPE: $sSo12MyMemberEnumVD
54+
// DEMANGLE-TYPE: $sSo18WrapperByAttributeaD
55+
// DEMANGLE-TYPE: $sSo7IceCubeVD
56+
// DEMANGLE-TYPE: $sSo10BlockOfIceaD
57+
// DEMANGLE-TYPE: $sSo17CCRefrigeratorRefa13foreign_typesE18InternalNestedTypeVD
58+
// DEMANGLE-TYPE: $sSo17CCRefrigeratorRefa13foreign_typesE17PrivateNestedType33_5415CB6AE6FCD935BF2278A4C9A5F9C3LLVD
59+
60+
// CHECK-TYPE: CCRefrigerator
61+
// CHECK-TYPE: MyError.Code
62+
// CHECK-TYPE: MyError
63+
// CHECK-TYPE: RenamedError.Code
64+
// CHECK-TYPE: RenamedError
65+
// CHECK-TYPE: Wrapper.MemberEnum
66+
// CHECK-TYPE: WrapperByAttribute
67+
// CHECK-TYPE: IceCube
68+
// CHECK-TYPE: BlockOfIce
69+
// CHECK-TYPE: CCRefrigerator.InternalNestedType
70+
// CHECK-TYPE: CCRefrigerator.PrivateNestedType
5571

56-
// CHECK: CCRefrigerator
57-
// CHECK: MyError.Code
58-
// CHECK: MyError
59-
// CHECK: RenamedError.Code
60-
// CHECK: RenamedError
61-
// CHECK: Wrapper.MemberEnum
62-
// CHECK: WrapperByAttribute
63-
// CHECK: IceCube
64-
// CHECK: BlockOfIce
65-
// CHECK: CCRefrigerator.InternalNestedType
66-
// CHECK: CCRefrigerator.PrivateNestedType
72+
// DEMANGLE-TYPE: $sSo17CCRefrigeratorRefamD
73+
// DEMANGLE-TYPE: $sSo7MyErrorVmD
74+
// DEMANGLE-TYPE: $sSC7MyErrorLeVmD
75+
// DEMANGLE-TYPE: $sSo14MyRenamedErrorVmD
76+
// DEMANGLE-TYPE: $sSC14MyRenamedErrorLeVmD
77+
// DEMANGLE-TYPE: $sSo12MyMemberEnumVmD
78+
// DEMANGLE-TYPE: $sSo18WrapperByAttributeamD
79+
// DEMANGLE-TYPE: $sSo7IceCubeVmD
80+
// DEMANGLE-TYPE: $sSo10BlockOfIceamD
81+
// DEMANGLE-TYPE: $sSo17CCRefrigeratorRefa13foreign_typesE18InternalNestedTypeVmD
82+
// DEMANGLE-TYPE: $sSo17CCRefrigeratorRefa13foreign_typesE17PrivateNestedType33_5415CB6AE6FCD935BF2278A4C9A5F9C3LLVmD
6783

68-
// DEMANGLE: $sSo17CCRefrigeratorRefamD
69-
// DEMANGLE: $sSo7MyErrorVmD
70-
// DEMANGLE: $sSC7MyErrorLeVmD
71-
// DEMANGLE: $sSo14MyRenamedErrorVmD
72-
// DEMANGLE: $sSC14MyRenamedErrorLeVmD
73-
// DEMANGLE: $sSo12MyMemberEnumVmD
74-
// DEMANGLE: $sSo18WrapperByAttributeamD
75-
// DEMANGLE: $sSo7IceCubeVmD
76-
// DEMANGLE: $sSo10BlockOfIceamD
77-
// DEMANGLE: $sSo17CCRefrigeratorRefa13foreign_typesE18InternalNestedTypeVmD
78-
// DEMANGLE: $sSo17CCRefrigeratorRefa13foreign_typesE17PrivateNestedType33_5415CB6AE6FCD935BF2278A4C9A5F9C3LLVmD
84+
// CHECK-TYPE: CCRefrigerator.Type
85+
// CHECK-TYPE: MyError.Code.Type
86+
// CHECK-TYPE: MyError.Type
87+
// CHECK-TYPE: RenamedError.Code.Type
88+
// CHECK-TYPE: RenamedError.Type
89+
// CHECK-TYPE: Wrapper.MemberEnum.Type
90+
// CHECK-TYPE: WrapperByAttribute.Type
91+
// CHECK-TYPE: IceCube.Type
92+
// CHECK-TYPE: BlockOfIce.Type
93+
// CHECK-TYPE: CCRefrigerator.InternalNestedType.Type
94+
// CHECK-TYPE: CCRefrigerator.PrivateNestedType.Type
7995

80-
// CHECK: CCRefrigerator.Type
81-
// CHECK: MyError.Code.Type
82-
// CHECK: MyError.Type
83-
// CHECK: RenamedError.Code.Type
84-
// CHECK: RenamedError.Type
85-
// CHECK: Wrapper.MemberEnum.Type
86-
// CHECK: WrapperByAttribute.Type
87-
// CHECK: IceCube.Type
88-
// CHECK: BlockOfIce.Type
89-
// CHECK: CCRefrigerator.InternalNestedType.Type
90-
// CHECK: CCRefrigerator.PrivateNestedType.Type
96+
// DEMANGLE-DECL: $sSo17CCRefrigeratorRefa
97+
// DEMANGLE-DECL: $sSo7MyErrorV
98+
// DEMANGLE-DECL: $sSo7MyErrorLeV
99+
// DEMANGLE-DECL: $sSo14MyRenamedErrorV
100+
// DEMANGLE-DECL: $sSo14MyRenamedErrorLeV
101+
// DEMANGLE-DECL: $sSo12MyMemberEnumV
102+
// DEMANGLE-DECL: $sSo18WrapperByAttributea
103+
// DEMANGLE-DECL: $sSo7IceCubeV
104+
// DEMANGLE-DECL: $sSo10BlockOfIcea
105+
// DEMANGLE-DECL: $sSo17CCRefrigeratorRefa13foreign_typesE18InternalNestedTypeV
106+
// DEMANGLE-DECL: $sSo17CCRefrigeratorRefa13foreign_typesE17PrivateNestedType33_5415CB6AE6FCD935BF2278A4C9A5F9C3LLV
91107

108+
// CHECK-DECL: CoreCooling.(file).CCRefrigerator
109+
// CHECK-DECL: ErrorEnums.(file).MyError.Code
110+
// CHECK-DECL: ErrorEnums.(file).MyError.Code
111+
// CHECK-DECL: ErrorEnums.(file).RenamedError.Code
112+
// CHECK-DECL: ErrorEnums.(file).RenamedError.Code
113+
// CHECK-DECL: ErrorEnums.(file).Wrapper extension.MemberEnum
114+
// CHECK-DECL: ErrorEnums.(file).WrapperByAttribute
115+
// CHECK-DECL: CoreCooling.(file).IceCube
116+
// CHECK-DECL: CoreCooling.(file).BlockOfIce
117+
// CHECK-DECL: foreign_types.(file).CCRefrigerator extension.InternalNestedType
118+
// CHECK-DECL: foreign_types.(file).CCRefrigerator extension.PrivateNestedType

0 commit comments

Comments
 (0)