@@ -567,58 +567,58 @@ class TypeRefBuilder {
567
567
return nullptr ;
568
568
}
569
569
570
+ // Recursively constructs TypeRef for a bound generic, including
571
+ // the enclosing (parent) generic contexts
570
572
const BoundGenericTypeRef *createBoundGenericTypeReconstructingParent (
571
573
const NodePointer node, const TypeRefDecl &decl, size_t shapeIndex,
572
574
const llvm::ArrayRef<const TypeRef *> &args, size_t argsIndex) {
573
575
if (!node || !node->hasChildren ())
574
576
return nullptr ;
575
-
577
+ NodePointer parentNode = node->getFirstChild ();
578
+
579
+ // If this node can't possibly be generic, skip it and
580
+ // return results for our parent instead
581
+ auto kind = node->getKind ();
582
+ if (kind != Node::Kind::Class
583
+ && kind != Node::Kind::Structure
584
+ && kind != Node::Kind::Enum) {
585
+ return createBoundGenericTypeReconstructingParent (
586
+ parentNode, decl, --shapeIndex, args, argsIndex);
587
+ }
588
+
589
+ // How many generic args are at this level?
576
590
auto maybeGenericParamsPerLevel = decl.genericParamsPerLevel ;
577
591
if (!maybeGenericParamsPerLevel)
578
592
return nullptr ;
579
-
580
593
auto genericParamsPerLevel = *maybeGenericParamsPerLevel;
581
-
582
- auto kind = node->getKind ();
583
- // Kinds who have a "BoundGeneric..." variant.
584
- if (kind != Node::Kind::Class && kind != Node::Kind::Structure &&
585
- kind != Node::Kind::Enum)
594
+ if (shapeIndex >= genericParamsPerLevel.size ())
586
595
return nullptr ;
596
+ auto numGenericArgs = genericParamsPerLevel[shapeIndex];
597
+
598
+ // Nodes with no generic args can be replaced with their parent
599
+ if (numGenericArgs == 0 ) {
600
+ return createBoundGenericTypeReconstructingParent (
601
+ parentNode, decl, --shapeIndex, args, argsIndex);
602
+ }
603
+
604
+ // Collect args for the BoundGenericTypeRef::create() call:
605
+
606
+ // * Mangling
587
607
auto mangling = Demangle::mangleNode (node);
588
608
if (!mangling.isSuccess ())
589
609
return nullptr ;
590
610
591
- if (shapeIndex >= genericParamsPerLevel.size ())
592
- return nullptr ;
593
-
594
- auto numGenericArgs = genericParamsPerLevel[shapeIndex];
595
-
611
+ // * Generic params for this node
596
612
auto startOffsetFromEnd = argsIndex + numGenericArgs;
597
613
auto endOffsetFromEnd = argsIndex;
598
614
if (startOffsetFromEnd > args.size () || endOffsetFromEnd > args.size ())
599
615
return nullptr ;
600
-
601
616
std::vector<const TypeRef *> genericParams (
602
617
args.end () - startOffsetFromEnd, args.end () - endOffsetFromEnd);
603
618
604
- const BoundGenericTypeRef *parent = nullptr ;
605
- if (node->hasChildren ()) {
606
- // Skip over nodes that are not of type class, enum or struct
607
- auto parentNode = node->getFirstChild ();
608
- while (parentNode->getKind () != Node::Kind::Class &&
609
- parentNode->getKind () != Node::Kind::Structure &&
610
- parentNode->getKind () != Node::Kind::Enum) {
611
- if (parentNode->hasChildren ()) {
612
- parentNode = parentNode->getFirstChild ();
613
- } else {
614
- parentNode = nullptr ;
615
- break ;
616
- }
617
- }
618
- if (parentNode)
619
- parent = createBoundGenericTypeReconstructingParent (
620
- parentNode, decl, --shapeIndex, args, argsIndex + numGenericArgs);
621
- }
619
+ // * Reconstructed parent
620
+ auto parent = createBoundGenericTypeReconstructingParent (
621
+ parentNode, decl, --shapeIndex, args, argsIndex + numGenericArgs);
622
622
623
623
return BoundGenericTypeRef::create (*this , mangling.result (), genericParams,
624
624
parent);
@@ -633,7 +633,6 @@ class TypeRefBuilder {
633
633
if (!builtTypeDecl->genericParamsPerLevel )
634
634
return BoundGenericTypeRef::create (*this , builtTypeDecl->mangledName , args, nullptr );
635
635
636
-
637
636
auto node = Dem.demangleType (builtTypeDecl->mangledName );
638
637
if (!node || !node->hasChildren () || node->getKind () != Node::Kind::Type)
639
638
return nullptr ;
0 commit comments