Skip to content

Commit 9287707

Browse files
committed
Support generic parent contexts in DemanglingForTypeRef.
1 parent 961dc59 commit 9287707

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

stdlib/public/Reflection/TypeRef.cpp

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,14 @@ class DemanglingForTypeRef
406406
: public TypeRefVisitor<DemanglingForTypeRef, Demangle::NodePointer> {
407407
Demangle::Demangler &Dem;
408408

409+
/// Demangle a type and dive into the outermost Type node.
410+
Demangle::NodePointer demangleAndUnwrapType(llvm::StringRef mangledName) {
411+
auto node = Dem.demangleType(mangledName);
412+
if (node && node->getKind() == Node::Kind::Type && node->getNumChildren())
413+
node = node->getFirstChild();
414+
return node;
415+
}
416+
409417
public:
410418
DemanglingForTypeRef(Demangle::Demangler &Dem) : Dem(Dem) {}
411419

@@ -420,13 +428,32 @@ class DemanglingForTypeRef
420428
}
421429

422430
Demangle::NodePointer visitBuiltinTypeRef(const BuiltinTypeRef *B) {
423-
return Dem.demangleType(B->getMangledName());
431+
return demangleAndUnwrapType(B->getMangledName());
424432
}
425433

426434
Demangle::NodePointer visitNominalTypeRef(const NominalTypeRef *N) {
427-
if (auto parent = N->getParent())
428-
assert(false && "not implemented");
429-
return Dem.demangleType(N->getMangledName());
435+
auto node = demangleAndUnwrapType(N->getMangledName());
436+
if (!node || node->getNumChildren() != 2)
437+
return node;
438+
439+
auto parent = N->getParent();
440+
if (!parent)
441+
return node;
442+
443+
// Swap in the richer parent that is stored in the NominalTypeRef
444+
// instead of what is encoded in the mangled name. The mangled name's
445+
// context has been "unspecialized" by NodeBuilder.
446+
auto parentNode = visit(parent);
447+
if (!parentNode)
448+
return node;
449+
if (parentNode->getKind() == Node::Kind::Type &&
450+
parentNode->getNumChildren())
451+
parentNode = parentNode->getFirstChild();
452+
453+
auto contextualizedNode = Dem.createNode(node->getKind());
454+
contextualizedNode->addChild(parentNode, Dem);
455+
contextualizedNode->addChild(node->getChild(1), Dem);
456+
return contextualizedNode;
430457
}
431458

432459
Demangle::NodePointer
@@ -650,7 +677,7 @@ class DemanglingForTypeRef
650677
}
651678

652679
Demangle::NodePointer visitForeignClassTypeRef(const ForeignClassTypeRef *F) {
653-
return Dem.demangleType(F->getName());
680+
return demangleAndUnwrapType(F->getName());
654681
}
655682

656683
Demangle::NodePointer visitObjCClassTypeRef(const ObjCClassTypeRef *OC) {

validation-test/Reflection/existentials.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ protocol Composition : P, Q {}
281281
struct S : Composition {}
282282
func getComposition() -> P & Q { return S() }
283283
reflect(any: getComposition())
284-
// CHECK-64: Mangled name: $s12existentials1PP_AA1QPp
284+
// CHECK-64: Mangled name: $s12existentials1P_AA1Qp
285285
// CHECK-64: Demangled name: existentials.P & existentials.Q
286286
// CHECK-32: Mangled name: $s12existentials1PP_AA1QPp
287287
// CHECK-32: Demangled name: existentials.P & existentials.Q

0 commit comments

Comments
 (0)