GenericArgumentMap TypeRef::getSubstMap() const { GenericArgumentMap Substitutions; switch (getKind()) { case TypeRefKind::Nominal: { auto Nom = cast<NominalTypeRef>(this); if (auto Parent = Nom->getParent()) return Parent->getSubstMap(); return GenericArgumentMap(); } case TypeRefKind::BoundGeneric: { auto BG = cast<BoundGenericTypeRef>(this); auto Depth = BG->getDepth(); unsigned Index = 0; for (auto Param : BG->getGenericParams()) Substitutions.insert({{Depth, Index++}, Param}); if (auto Parent = BG->getParent()) { auto ParentSubs = Parent->getSubstMap(); Substitutions.insert(ParentSubs.begin(), ParentSubs.end()); } break; } default: break; } return Substitutions; }