Skip to content

Commit c0c02a3

Browse files
committed
Reflection: ProtocolTypeRefs now store a mangled name
This is better for field metadata lookups. Clients that want the module name and decl name can demangle, just like they do with NominalTypeRefs.
1 parent 00e0c89 commit c0c02a3

File tree

6 files changed

+50
-35
lines changed

6 files changed

+50
-35
lines changed

include/swift/Reflection/TypeRef.h

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -222,36 +222,28 @@ class FunctionTypeRef final : public TypeRef {
222222
};
223223

224224
class ProtocolTypeRef final : public TypeRef {
225-
std::string ModuleName;
226-
std::string Name;
225+
std::string MangledName;
227226

228227
public:
229-
ProtocolTypeRef(const std::string &ModuleName,
230-
const std::string &Name)
231-
: TypeRef(TypeRefKind::Protocol), ModuleName(ModuleName), Name(Name) {}
228+
ProtocolTypeRef(const std::string &MangledName)
229+
: TypeRef(TypeRefKind::Protocol), MangledName(MangledName) {}
232230

233231
template <typename Allocator>
234232
static const ProtocolTypeRef *
235-
create(Allocator &A, const std::string &ModuleName,
236-
const std::string &Name) {
237-
return A.template makeTypeRef<ProtocolTypeRef>(ModuleName, Name);
238-
}
239-
240-
const std::string &getName() const {
241-
return Name;
233+
create(Allocator &A, const std::string &MangledName) {
234+
return A.template makeTypeRef<ProtocolTypeRef>(MangledName);
242235
}
243236

244-
const std::string &getModuleName() const {
245-
return ModuleName;
237+
const std::string &getMangledName() const {
238+
return MangledName;
246239
}
247240

248241
static bool classof(const TypeRef *TR) {
249242
return TR->getKind() == TypeRefKind::Protocol;
250243
}
251244

252245
bool operator==(const ProtocolTypeRef &Other) const {
253-
return ModuleName.compare(Other.ModuleName) == 0 &&
254-
Name.compare(Other.Name) == 0;
246+
return MangledName == Other.MangledName;
255247
}
256248
bool operator!=(const ProtocolTypeRef &Other) const {
257249
return !(*this == Other);

include/swift/Reflection/TypeRefBuilder.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,10 @@ class TypeRefBuilder {
151151
return FunctionTypeRef::create(*this, args, result, flags);
152152
}
153153

154-
const ProtocolTypeRef *createProtocolType(const std::string &moduleName,
155-
const std::string &protocolName) {
156-
return ProtocolTypeRef::create(*this, moduleName, protocolName);
154+
const ProtocolTypeRef *createProtocolType(const std::string &mangledName,
155+
const std::string &moduleName,
156+
const std::string &name) {
157+
return ProtocolTypeRef::create(*this, mangledName);
157158
}
158159

159160
const ProtocolCompositionTypeRef *

include/swift/Remote/MetadataReader.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,17 @@ class TypeDecoder {
120120
case NodeKind::Protocol: {
121121
auto moduleName = Node->getChild(0)->getText();
122122
auto name = Node->getChild(1)->getText();
123-
return Builder.createProtocolType(moduleName, name);
123+
124+
// Consistent handling of protocols and protocol compositions
125+
auto protocolList = Demangle::NodeFactory::create(NodeKind::ProtocolList);
126+
auto typeList = Demangle::NodeFactory::create(NodeKind::TypeList);
127+
auto type = Demangle::NodeFactory::create(NodeKind::Type);
128+
type->addChild(Node);
129+
typeList->addChild(type);
130+
protocolList->addChild(typeList);
131+
132+
auto mangledName = Demangle::mangleNode(protocolList);
133+
return Builder.createProtocolType(mangledName, moduleName, name);
124134
}
125135
case NodeKind::DependentGenericParamType: {
126136
auto depth = Node->getChild(0)->getIndex();

lib/RemoteAST/RemoteAST.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,9 @@ class RemoteASTTypeBuilder {
246246
return FunctionType::get(input, output, einfo);
247247
}
248248

249-
Type createProtocolType(StringRef moduleName, StringRef protocolName) {
249+
Type createProtocolType(StringRef mangledName,
250+
StringRef moduleName,
251+
StringRef protocolName) {
250252
auto module = Ctx.getModuleByName(moduleName);
251253
if (!module) return Type();
252254

stdlib/public/Reflection/TypeRef.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ class PrintTypeRef : public TypeRefVisitor<PrintTypeRef, void> {
133133

134134
void visitProtocolTypeRef(const ProtocolTypeRef *P) {
135135
printHeader("protocol");
136-
printField("module", P->getModuleName());
137-
printField("name", P->getName());
136+
auto demangled = Demangle::demangleTypeAsString(P->getMangledName());
137+
printField("", demangled);
138138
OS << ')';
139139
}
140140

test/Reflection/typeref_decoding.result.txt

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ primaryArchetype: A
235235

236236
dependentMember1: A.Inner
237237
(dependent_member
238-
(protocol module=TypesToReflect name=P1)
238+
(protocol TypesToReflect.P1)
239239
(generic_type_parameter depth=0 index=0) member=Inner)
240240

241241
TypesToReflect.C3
@@ -279,14 +279,14 @@ primaryArchetype: A
279279

280280
dependentMember1: A.Outer
281281
(dependent_member
282-
(protocol module=TypesToReflect name=P2)
282+
(protocol TypesToReflect.P2)
283283
(generic_type_parameter depth=0 index=0) member=Outer)
284284

285285
dependentMember2: A.Outer.Inner
286286
(dependent_member
287-
(protocol module=TypesToReflect name=P1)
287+
(protocol TypesToReflect.P1)
288288
(dependent_member
289-
(protocol module=TypesToReflect name=P2)
289+
(protocol TypesToReflect.P2)
290290
(generic_type_parameter depth=0 index=0) member=Outer) member=Inner)
291291

292292
TypesToReflect.C4
@@ -379,7 +379,7 @@ primaryArchetype: A
379379

380380
dependentMember1: A.Inner
381381
(dependent_member
382-
(protocol module=TypesToReflect name=P1)
382+
(protocol TypesToReflect.P1)
383383
(generic_type_parameter depth=0 index=0) member=Inner)
384384

385385
TypesToReflect.S3
@@ -427,14 +427,14 @@ primaryArchetype: A
427427

428428
dependentMember1: A.Outer
429429
(dependent_member
430-
(protocol module=TypesToReflect name=P2)
430+
(protocol TypesToReflect.P2)
431431
(generic_type_parameter depth=0 index=0) member=Outer)
432432

433433
dependentMember2: A.Outer.Inner
434434
(dependent_member
435-
(protocol module=TypesToReflect name=P1)
435+
(protocol TypesToReflect.P1)
436436
(dependent_member
437-
(protocol module=TypesToReflect name=P2)
437+
(protocol TypesToReflect.P2)
438438
(generic_type_parameter depth=0 index=0) member=Outer) member=Inner)
439439

440440
TypesToReflect.S4
@@ -511,7 +511,7 @@ Primary: A
511511

512512
DependentMemberInner: A.Inner
513513
(dependent_member
514-
(protocol module=TypesToReflect name=P1)
514+
(protocol TypesToReflect.P1)
515515
(generic_type_parameter depth=0 index=0) member=Inner)
516516

517517
ExistentialMetatype: A.Type
@@ -553,18 +553,28 @@ Primary: A
553553

554554
DependentMemberOuter: A.Outer
555555
(dependent_member
556-
(protocol module=TypesToReflect name=P2)
556+
(protocol TypesToReflect.P2)
557557
(generic_type_parameter depth=0 index=0) member=Outer)
558558

559559
DependentMemberInner: A.Outer.Inner
560560
(dependent_member
561-
(protocol module=TypesToReflect name=P1)
561+
(protocol TypesToReflect.P1)
562562
(dependent_member
563-
(protocol module=TypesToReflect name=P2)
563+
(protocol TypesToReflect.P2)
564564
(generic_type_parameter depth=0 index=0) member=Outer) member=Inner)
565565

566566
TypesToReflect.E4
567567
-----------------
568+
TypesToReflect.P1
569+
-----------------
570+
TypesToReflect.P2
571+
-----------------
572+
TypesToReflect.P3
573+
-----------------
574+
TypesToReflect.P4
575+
-----------------
576+
TypesToReflect.ClassBoundP
577+
--------------------------
568578

569579
ASSOCIATED TYPES:
570580
=================

0 commit comments

Comments
 (0)