Skip to content

Commit e41ed0f

Browse files
committed
Implement typeref to demangle tree conversion for nested bound generics
1 parent 13b3ac9 commit e41ed0f

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

stdlib/public/Reflection/TypeRef.cpp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,35 @@ class DemanglingForTypeRef
583583
genericNode->addChild(unspecializedType, Dem);
584584
genericNode->addChild(genericArgsList, Dem);
585585

586-
if (auto parent = BG->getParent())
587-
assert(false && "not implemented");
586+
auto parent = BG->getParent();
587+
if (!parent)
588+
return genericNode;
589+
590+
auto parentNode = visit(parent);
591+
if (!parentNode || !parentNode->hasChildren() ||
592+
parentNode->getKind() != Node::Kind::Type ||
593+
!unspecializedType->hasChildren())
594+
return genericNode;
595+
596+
// Peel off the "Type" node.
597+
parentNode = parentNode->getFirstChild();
598+
599+
auto nominalNode = unspecializedType->getFirstChild();
600+
601+
if (nominalNode->getNumChildren() != 2)
602+
return genericNode;
603+
604+
// Save identifier for reinsertion later, we have to remove it
605+
// so we can insert the parent node as the first child.
606+
auto identifierNode = nominalNode->getLastChild();
607+
608+
// Remove all children.
609+
nominalNode->removeChildAt(1);
610+
nominalNode->removeChildAt(0);
611+
612+
// Add the parent we just visited back in, followed by the identifier.
613+
nominalNode->addChild(parentNode, Dem);
614+
nominalNode->addChild(identifierNode, Dem);
588615

589616
return genericNode;
590617
}

0 commit comments

Comments
 (0)