@@ -406,6 +406,14 @@ class DemanglingForTypeRef
406
406
: public TypeRefVisitor<DemanglingForTypeRef, Demangle::NodePointer> {
407
407
Demangle::Demangler &Dem;
408
408
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
+
409
417
public:
410
418
DemanglingForTypeRef (Demangle::Demangler &Dem) : Dem(Dem) {}
411
419
@@ -420,13 +428,32 @@ class DemanglingForTypeRef
420
428
}
421
429
422
430
Demangle::NodePointer visitBuiltinTypeRef (const BuiltinTypeRef *B) {
423
- return Dem. demangleType (B->getMangledName ());
431
+ return demangleAndUnwrapType (B->getMangledName ());
424
432
}
425
433
426
434
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;
430
457
}
431
458
432
459
Demangle::NodePointer
@@ -650,7 +677,7 @@ class DemanglingForTypeRef
650
677
}
651
678
652
679
Demangle::NodePointer visitForeignClassTypeRef (const ForeignClassTypeRef *F) {
653
- return Dem. demangleType (F->getName ());
680
+ return demangleAndUnwrapType (F->getName ());
654
681
}
655
682
656
683
Demangle::NodePointer visitObjCClassTypeRef (const ObjCClassTypeRef *OC) {
0 commit comments