Skip to content

Commit b9b296b

Browse files
committed
AST: Use GenericEnvironment in ArchetypeBuilder::mapType{Into,OutOf}Context()
When we call the DeclContext variants of these, use the DeclContext's GenericEnvironment instead of GenericParamList. Also, these functions would take a resolver argument, but we always passed in nullptr, so just remove it now. The old GenericParamList-based versions are still there since they're called directly from SIL. They will go away once SILFunction::ContextGenericParams is replaced with a GenericEnvironment.
1 parent 1c1ab0b commit b9b296b

File tree

5 files changed

+60
-25
lines changed

5 files changed

+60
-25
lines changed

include/swift/AST/ArchetypeBuilder.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,18 +329,26 @@ class ArchetypeBuilder {
329329
ArrayRef<ArchetypeType *> getAllArchetypes();
330330

331331
/// Map an interface type to a contextual type.
332-
static Type mapTypeIntoContext(const DeclContext *dc, Type type,
333-
LazyResolver *resolver = nullptr);
332+
static Type mapTypeIntoContext(const DeclContext *dc, Type type);
334333

335334
/// Map an interface type to a contextual type.
336335
static Type mapTypeIntoContext(ModuleDecl *M,
337-
GenericParamList *genericParams,
338-
Type type,
339-
LazyResolver *resolver = nullptr);
336+
GenericEnvironment *genericEnv,
337+
Type type);
340338

341339
/// Map a contextual type to an interface type.
342340
static Type mapTypeOutOfContext(const DeclContext *dc, Type type);
343341

342+
/// Map a contextual type to an interface type.
343+
static Type mapTypeOutOfContext(ModuleDecl *M,
344+
GenericEnvironment *genericEnv,
345+
Type type);
346+
347+
/// Map an interface type to a contextual type.
348+
static Type mapTypeIntoContext(ModuleDecl *M,
349+
GenericParamList *genericParams,
350+
Type type);
351+
344352
/// Map a contextual type to an interface type.
345353
static Type mapTypeOutOfContext(ModuleDecl *M,
346354
GenericParamList *genericParams,

lib/AST/ArchetypeBuilder.cpp

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2011,17 +2011,49 @@ void ArchetypeBuilder::dump(llvm::raw_ostream &out) {
20112011
out << "\n";
20122012
}
20132013

2014-
Type ArchetypeBuilder::mapTypeIntoContext(const DeclContext *dc, Type type,
2015-
LazyResolver *resolver) {
2016-
auto genericParams = dc->getGenericParamsOfContext();
2017-
return mapTypeIntoContext(dc->getParentModule(), genericParams, type,
2018-
resolver);
2014+
Type ArchetypeBuilder::mapTypeIntoContext(const DeclContext *dc, Type type) {
2015+
return mapTypeIntoContext(dc->getParentModule(),
2016+
dc->getGenericEnvironmentOfContext(),
2017+
type);
2018+
}
2019+
2020+
Type ArchetypeBuilder::mapTypeIntoContext(ModuleDecl *M,
2021+
GenericEnvironment *env,
2022+
Type type) {
2023+
auto canType = type->getCanonicalType();
2024+
assert(!canType->hasArchetype() && "already have a contextual type");
2025+
if (!canType->hasTypeParameter())
2026+
return type;
2027+
2028+
assert(env && "dependent type in non-generic context");
2029+
2030+
return env->mapTypeIntoContext(M, type);
2031+
}
2032+
2033+
Type
2034+
ArchetypeBuilder::mapTypeOutOfContext(const DeclContext *dc, Type type) {
2035+
return mapTypeOutOfContext(dc->getParentModule(),
2036+
dc->getGenericEnvironmentOfContext(),
2037+
type);
2038+
}
2039+
2040+
Type
2041+
ArchetypeBuilder::mapTypeOutOfContext(ModuleDecl *M,
2042+
GenericEnvironment *env,
2043+
Type type) {
2044+
auto canType = type->getCanonicalType();
2045+
assert(!canType->hasTypeParameter() && "already have an interface type");
2046+
if (!canType->hasArchetype())
2047+
return type;
2048+
2049+
assert(env && "dependent type in non-generic context");
2050+
2051+
return env->mapTypeOutOfContext(M, type);
20192052
}
20202053

20212054
Type ArchetypeBuilder::mapTypeIntoContext(Module *M,
20222055
GenericParamList *genericParams,
2023-
Type type,
2024-
LazyResolver *resolver) {
2056+
Type type) {
20252057
auto canType = type->getCanonicalType();
20262058
assert(!canType->hasArchetype() && "already have a contextual type");
20272059
if (!canType->hasTypeParameter())
@@ -2053,8 +2085,8 @@ Type ArchetypeBuilder::mapTypeIntoContext(Module *M,
20532085
// Map a dependent member to the corresponding nested archetype.
20542086
if (auto dependentMember = type->getAs<DependentMemberType>()) {
20552087
auto base = mapTypeIntoContext(M, genericParams,
2056-
dependentMember->getBase(), resolver);
2057-
return dependentMember->substBaseType(M, base, resolver);
2088+
dependentMember->getBase());
2089+
return dependentMember->substBaseType(M, base);
20582090
}
20592091

20602092
return type;
@@ -2064,12 +2096,6 @@ Type ArchetypeBuilder::mapTypeIntoContext(Module *M,
20642096
return type;
20652097
}
20662098

2067-
Type
2068-
ArchetypeBuilder::mapTypeOutOfContext(const DeclContext *dc, Type type) {
2069-
GenericParamList *genericParams = dc->getGenericParamsOfContext();
2070-
return mapTypeOutOfContext(dc->getParentModule(), genericParams, type);
2071-
}
2072-
20732099
Type ArchetypeBuilder::mapTypeOutOfContext(ModuleDecl *M,
20742100
GenericParamList *genericParams,
20752101
Type type) {

lib/IRGen/GenMeta.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ static void emitPolymorphicParametersFromArray(IRGenFunction &IGF,
236236
array = IGF.Builder.CreateElementBitCast(array, IGF.IGM.TypeMetadataPtrTy);
237237

238238
auto getInContext = [&](CanType type) -> CanType {
239-
return ArchetypeBuilder::mapTypeIntoContext(typeDecl, type, nullptr)
239+
return ArchetypeBuilder::mapTypeIntoContext(typeDecl, type)
240240
->getCanonicalType();
241241
};
242242

@@ -2767,7 +2767,7 @@ irgen::emitFieldTypeAccessor(IRGenModule &IGM,
27672767
auto declCtxt = type;
27682768
if (auto generics = declCtxt->getGenericSignatureOfContext()) {
27692769
auto getInContext = [&](CanType type) -> CanType {
2770-
return ArchetypeBuilder::mapTypeIntoContext(declCtxt, type, nullptr)
2770+
return ArchetypeBuilder::mapTypeIntoContext(declCtxt, type)
27712771
->getCanonicalType();
27722772
};
27732773
bindArchetypeAccessPaths(IGF, generics, getInContext);

lib/IRGen/GenProto.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1281,7 +1281,7 @@ class AccessorConformanceInfo : public ConformanceInfo {
12811281
auto declCtx = Conformance.getDeclContext();
12821282
if (auto generics = declCtx->getGenericSignatureOfContext()) {
12831283
auto getInContext = [&](CanType type) -> CanType {
1284-
return ArchetypeBuilder::mapTypeIntoContext(declCtx, type, nullptr)
1284+
return ArchetypeBuilder::mapTypeIntoContext(declCtx, type)
12851285
->getCanonicalType();
12861286
};
12871287
bindArchetypeAccessPaths(IGF, generics, getInContext);

lib/SILGen/SILGenBridging.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,8 +1282,9 @@ void SILGenFunction::emitForeignToNativeThunk(SILDeclRef thunk) {
12821282
auto fnType = fn->getType().castTo<SILFunctionType>();
12831283
fnType = fnType->substGenericArgs(SGM.M, SGM.SwiftModule, subs);
12841284

1285-
CanType substResultTy{
1286-
ArchetypeBuilder::mapTypeIntoContext(fd, nativeFormalResultTy)};
1285+
auto substResultTy =
1286+
ArchetypeBuilder::mapTypeIntoContext(fd, nativeFormalResultTy)
1287+
->getCanonicalType();
12871288

12881289
auto resultMV = emitApply(fd, ManagedValue::forUnmanaged(fn),
12891290
subs, args, fnType,

0 commit comments

Comments
 (0)