25
25
26
26
#include " swift/AST/ClangModuleLoader.h"
27
27
#include " swift/Basic/Version.h"
28
+ #include " swift/../../lib/ClangImporter/ClangAdapter.h"
28
29
#include " swift/Demangling/Demangle.h"
29
30
#include " swift/Demangling/Demangler.h"
30
31
#include " swift/Strings.h"
@@ -90,20 +91,85 @@ static CompilerType LookupClangForwardType(SwiftASTContext *module_holder,
90
91
return {};
91
92
}
92
93
94
+ // / Return a demangle tree for an UnsafePointer<Pointee>.
95
+ static swift::Demangle::NodePointer
96
+ GetPointerTo (swift::Demangle::Demangler &dem,
97
+ swift::Demangle::NodePointer pointee) {
98
+ using namespace swift ::Demangle;
99
+ auto *bgs = dem.createNode (Node::Kind::BoundGenericStructure);
100
+ // Construct the first branch of BoundGenericStructure.
101
+ {
102
+ auto *type = dem.createNode (Node::Kind::Type);
103
+ auto *structure = dem.createNode (Node::Kind::Structure);
104
+ structure->addChild (
105
+ dem.createNodeWithAllocatedText (Node::Kind::Module, swift::STDLIB_NAME),
106
+ dem);
107
+ structure->addChild (dem.createNode (Node::Kind::Identifier, " UnsafePointer" ),
108
+ dem);
109
+ type->addChild (structure, dem);
110
+ bgs->addChild (type, dem);
111
+ }
112
+
113
+ // Construct the second branch of BoundGenericStructure.
114
+ {
115
+ auto *typelist = dem.createNode (Node::Kind::TypeList);
116
+ auto *type = dem.createNode (Node::Kind::Type);
117
+ typelist->addChild (type, dem);
118
+ type->addChild (pointee, dem);
119
+ bgs->addChild (typelist, dem);
120
+ }
121
+ return bgs;
122
+ }
123
+
93
124
// / Return a demangle tree leaf node representing \p clang_type.
94
125
static swift::Demangle::NodePointer
95
126
GetClangTypeNode (CompilerType clang_type, swift::Demangle::Demangler &dem) {
96
127
using namespace swift ::Demangle;
97
- clang::QualType qual_type = ClangUtil::GetQualType (clang_type);
98
- NodePointer structure = dem.createNode (
99
- qual_type->isClassType () ? Node::Kind::Class : Node::Kind::Structure);
100
- NodePointer module = dem.createNodeWithAllocatedText (
101
- Node::Kind::Module, swift::MANGLING_MODULE_OBJC);
128
+ Node::Kind kind;
129
+ llvm::StringRef swift_name;
130
+ llvm::StringRef module_name = swift::MANGLING_MODULE_OBJC;
131
+ CompilerType pointee;
132
+ if (clang_type.IsPointerType (&pointee))
133
+ clang_type = pointee;
134
+
135
+ switch (clang_type.GetTypeClass ()) {
136
+ case eTypeClassClass:
137
+ case eTypeClassObjCObjectPointer:
138
+ // Objective-C objects are first-class entities, not pointers.
139
+ kind = Node::Kind::Class;
140
+ pointee = {};
141
+ break ;
142
+ case eTypeClassBuiltin:
143
+ kind = Node::Kind::Structure;
144
+ // Ask ClangImporter about the builtin type's Swift name.
145
+ if (auto *ts = llvm::cast<TypeSystemClang>(clang_type.GetTypeSystem ())) {
146
+ if (clang_type == ts->GetPointerSizedIntType (true )) {
147
+ swift_name = " Int" ;
148
+ break ;
149
+ }
150
+ if (clang_type == ts->GetPointerSizedIntType (false )) {
151
+ swift_name = " UInt" ;
152
+ break ;
153
+ }
154
+ swift_name = swift::importer::getClangTypeNameForOmission (
155
+ ts->getASTContext (), ClangUtil::GetQualType (clang_type))
156
+ .Name ;
157
+ module_name = swift::STDLIB_NAME;
158
+ }
159
+ break ;
160
+ default :
161
+ kind = Node::Kind::Structure;
162
+ }
163
+ NodePointer structure = dem.createNode (kind);
164
+ NodePointer module =
165
+ dem.createNodeWithAllocatedText (Node::Kind::Module, module_name);
102
166
structure->addChild (module , dem);
103
167
NodePointer identifier = dem.createNodeWithAllocatedText (
104
- Node::Kind::Module, clang_type.GetTypeName ().GetStringRef ());
168
+ Node::Kind::Identifier, swift_name.empty ()
169
+ ? clang_type.GetTypeName ().GetStringRef ()
170
+ : swift_name);
105
171
structure->addChild (identifier, dem);
106
- return structure;
172
+ return pointee ? GetPointerTo (dem, structure) : structure;
107
173
}
108
174
109
175
// / \return the child of the \p Type node.
@@ -1741,7 +1807,6 @@ CompilerType
1741
1807
TypeSystemSwiftTypeRef::GetPointeeType (opaque_compiler_type_t type) {
1742
1808
return m_swift_ast_context->GetPointeeType (ReconstructType (type));
1743
1809
}
1744
-
1745
1810
CompilerType
1746
1811
TypeSystemSwiftTypeRef::GetPointerType (opaque_compiler_type_t type) {
1747
1812
auto impl = [&]() -> CompilerType {
@@ -1753,31 +1818,8 @@ TypeSystemSwiftTypeRef::GetPointerType(opaque_compiler_type_t type) {
1753
1818
// The UnsafePointer type.
1754
1819
auto *pointer_type = dem.createNode (Node::Kind::Type);
1755
1820
1756
- auto *bgs = dem. createNode (Node::Kind::BoundGenericStructure );
1821
+ auto *bgs = GetPointerTo (dem, pointee_type );
1757
1822
pointer_type->addChild (bgs, dem);
1758
-
1759
- // Construct the first branch of BoundGenericStructure.
1760
- {
1761
- auto *type = dem.createNode (Node::Kind::Type);
1762
- bgs->addChild (type, dem);
1763
- auto *structure = dem.createNode (Node::Kind::Structure);
1764
- type->addChild (structure, dem);
1765
- structure->addChild (dem.createNodeWithAllocatedText (Node::Kind::Module,
1766
- swift::STDLIB_NAME),
1767
- dem);
1768
- structure->addChild (
1769
- dem.createNode (Node::Kind::Identifier, " UnsafePointer" ), dem);
1770
- }
1771
-
1772
- // Construct the second branch of BoundGenericStructure.
1773
- {
1774
- auto *typelist = dem.createNode (Node::Kind::TypeList);
1775
- bgs->addChild (typelist, dem);
1776
- auto *type = dem.createNode (Node::Kind::Type);
1777
- typelist->addChild (type, dem);
1778
- type->addChild (pointee_type, dem);
1779
- }
1780
-
1781
1823
return RemangleAsType (dem, pointer_type);
1782
1824
};
1783
1825
VALIDATE_AND_RETURN (impl, GetPointerType, type, (ReconstructType (type)));
0 commit comments