Skip to content

Commit fd1ea3d

Browse files
committed
AST: TypeTransformer walks into substitutions of local archetypes
1 parent fa286b9 commit fd1ea3d

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

include/swift/AST/TypeTransform.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#ifndef SWIFT_AST_TYPETRANSFORM_H
1919
#define SWIFT_AST_TYPETRANSFORM_H
2020

21+
#include "swift/AST/GenericEnvironment.h"
2122
#include "swift/AST/SILLayout.h"
2223

2324
namespace swift {
@@ -136,7 +137,29 @@ case TypeKind::Id:
136137
newSubMap);
137138
}
138139

139-
case TypeKind::OpenedArchetype:
140+
case TypeKind::OpenedArchetype: {
141+
auto *local = cast<LocalArchetypeType>(base);
142+
if (auto result = asDerived().transformLocalArchetypeType(local, pos))
143+
return *result;
144+
145+
auto *env = local->getGenericEnvironment();
146+
147+
auto genericSig = env->getGenericSignature();
148+
auto existentialTy = env->getOpenedExistentialType();
149+
auto subMap = env->getOuterSubstitutions();
150+
auto uuid = env->getOpenedExistentialUUID();
151+
152+
auto newSubMap = asDerived().transformSubMap(subMap);
153+
if (newSubMap == subMap)
154+
return t;
155+
if (!newSubMap)
156+
return Type();
157+
158+
auto *newEnv = GenericEnvironment::forOpenedExistential(
159+
genericSig, existentialTy, newSubMap, uuid);
160+
return newEnv->mapTypeIntoContext(local->getInterfaceType());
161+
}
162+
140163
case TypeKind::ElementArchetype: {
141164
auto *local = cast<LocalArchetypeType>(base);
142165
if (auto result = asDerived().transformLocalArchetypeType(local, pos))

0 commit comments

Comments
 (0)