@@ -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+
409417public:
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) {
0 commit comments