Skip to content

Commit 58b1ea6

Browse files
committed
Implement typeref to demangle tree conversion for nested bound generics
rdar://90218547
1 parent 9aa2de4 commit 58b1ea6

File tree

1 file changed

+28
-2
lines changed

1 file changed

+28
-2
lines changed

stdlib/public/Reflection/TypeRef.cpp

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,9 +579,35 @@ class DemanglingForTypeRef
579579
genericNode->addChild(unspecializedType, Dem);
580580
genericNode->addChild(genericArgsList, Dem);
581581

582-
if (auto parent = BG->getParent())
583-
assert(false && "not implemented");
582+
auto parent = BG->getParent();
583+
if (!parent)
584+
return genericNode;
585+
586+
auto parentNode = visit(parent);
587+
if (!parentNode || !parentNode->hasChildren() ||
588+
parentNode->getKind() != Node::Kind::Type ||
589+
!unspecializedType->hasChildren())
590+
return genericNode;
584591

592+
// Peel off the "Type" node.
593+
parentNode = parentNode->getFirstChild();
594+
595+
auto nominalNode = unspecializedType->getFirstChild();
596+
597+
if (nominalNode->getNumChildren() != 2)
598+
return genericNode;
599+
600+
// Save identifier for reinsertion later, we have to remove it
601+
// so we can insert the parent node as the first child.
602+
auto identifierNode = nominalNode->getLastChild();
603+
604+
// Remove all children.
605+
nominalNode->removeChildAt(1);
606+
nominalNode->removeChildAt(0);
607+
608+
// Add the parent we just visited back in, followed by the identifier.
609+
nominalNode->addChild(parentNode, Dem);
610+
nominalNode->addChild(identifierNode, Dem);
585611
return genericNode;
586612
}
587613

0 commit comments

Comments
 (0)