Skip to content

Commit 50ab7f5

Browse files
committed
AST: Remove more usages of ArchetypeType::getRoot()
1 parent 5ac51b9 commit 50ab7f5

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

lib/AST/ASTMangler.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/AST/ExistentialLayout.h"
2323
#include "swift/AST/Expr.h"
2424
#include "swift/AST/FileUnit.h"
25+
#include "swift/AST/GenericEnvironment.h"
2526
#include "swift/AST/GenericSignature.h"
2627
#include "swift/AST/Initializer.h"
2728
#include "swift/AST/LazyResolver.h"
@@ -2248,12 +2249,15 @@ void ASTMangler::appendOpaqueTypeArchetype(ArchetypeType *archetype,
22482249

22492250
appendOperator("Qo", Index(genericParam->getIndex()));
22502251
} else {
2252+
auto *env = archetype->getGenericEnvironment();
2253+
appendType(env->mapTypeIntoContext(interfaceType->getRootGenericParam()),
2254+
sig, forDecl);
2255+
22512256
// Mangle associated types of opaque archetypes like dependent member
22522257
// types, so that they can be accurately demangled at runtime.
2253-
appendType(Type(archetype->getRoot()), sig, forDecl);
22542258
bool isAssocTypeAtDepth = false;
22552259
appendAssocType(
2256-
archetype->getInterfaceType()->castTo<DependentMemberType>(),
2260+
interfaceType->castTo<DependentMemberType>(),
22572261
sig, isAssocTypeAtDepth);
22582262
appendOperator(isAssocTypeAtDepth ? "QX" : "Qx");
22592263
}

lib/AST/ASTPrinter.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7012,16 +7012,17 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
70127012
Printer << "each ";
70137013
}
70147014

7015-
void printArchetypeCommon(Type interfaceTy, ArchetypeType *archetypeTy) {
7015+
void printArchetypeCommon(Type interfaceTy, GenericEnvironment *env) {
70167016
if (auto *paramTy = interfaceTy->getAs<GenericTypeParamType>()) {
7017-
assert(archetypeTy->isRoot());
7018-
70197017
if (Options.AlternativeTypeNames) {
7020-
auto found = Options.AlternativeTypeNames->find(CanType(archetypeTy));
7021-
if (found != Options.AlternativeTypeNames->end()) {
7022-
if (paramTy->isParameterPack()) printEach();
7023-
Printer << found->second.str();
7024-
return;
7018+
auto archetypeTy = env->mapTypeIntoContext(paramTy)->getAs<GenericTypeParamType>();
7019+
if (archetypeTy) {
7020+
auto found = Options.AlternativeTypeNames->find(CanType(archetypeTy));
7021+
if (found != Options.AlternativeTypeNames->end()) {
7022+
if (paramTy->isParameterPack()) printEach();
7023+
Printer << found->second.str();
7024+
return;
7025+
}
70257026
}
70267027
}
70277028

@@ -7030,18 +7031,18 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
70307031
}
70317032

70327033
auto *memberTy = interfaceTy->castTo<DependentMemberType>();
7033-
if (memberTy->getBase()->is<GenericTypeParamType>())
7034-
visitParentType(archetypeTy->getRoot());
7034+
if (auto *paramTy = memberTy->getBase()->getAs<GenericTypeParamType>())
7035+
visitParentType(env->mapTypeIntoContext(paramTy));
70357036
else {
7036-
printArchetypeCommon(memberTy->getBase(), archetypeTy->getRoot());
7037+
printArchetypeCommon(memberTy->getBase(), env);
70377038
Printer << ".";
70387039
}
70397040

70407041
printDependentMember(memberTy);
70417042
}
70427043

70437044
void visitPrimaryArchetypeType(PrimaryArchetypeType *T) {
7044-
printArchetypeCommon(T->getInterfaceType(), T);
7045+
printArchetypeCommon(T->getInterfaceType(), T->getGenericEnvironment());
70457046
}
70467047

70477048
void visitOpaqueTypeArchetypeType(OpaqueTypeArchetypeType *T) {
@@ -7050,7 +7051,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
70507051

70517052
if (!paramTy) {
70527053
assert(interfaceTy->is<DependentMemberType>());
7053-
printArchetypeCommon(interfaceTy, T);
7054+
printArchetypeCommon(interfaceTy, T->getGenericEnvironment());
70547055
return;
70557056
}
70567057

@@ -7135,7 +7136,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
71357136
}
71367137

71377138
void visitPackArchetypeType(PackArchetypeType *T) {
7138-
printArchetypeCommon(T->getInterfaceType(), T);
7139+
printArchetypeCommon(T->getInterfaceType(), T->getGenericEnvironment());
71397140
}
71407141

71417142
void visitGenericTypeParamType(GenericTypeParamType *T) {

0 commit comments

Comments
 (0)