Skip to content

Commit 1cc5456

Browse files
committed
AST: Simplify SubstitutionMap::get() that takes a replacement type array
1 parent 28b2a82 commit 1cc5456

File tree

4 files changed

+34
-22
lines changed

4 files changed

+34
-22
lines changed

include/swift/AST/SubstitutionMap.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,15 @@ class SubstitutionMap {
104104
ArrayRef<Type> replacementTypes,
105105
LookupConformanceFn lookupConformance);
106106

107+
/// Build a substitution map from the substitutions represented by
108+
/// the given in-flight substitution.
109+
///
110+
/// This function should generally only be used by the substitution
111+
/// subsystem.
112+
static SubstitutionMap get(GenericSignature genericSig,
113+
ArrayRef<Type> replacementTypes,
114+
InFlightSubstitution &IFS);
115+
107116
/// Build a substitution map from the substitutions represented by
108117
/// the given in-flight substitution.
109118
///

include/swift/AST/TypeTransform.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -998,9 +998,7 @@ case TypeKind::Id:
998998
return subs;
999999

10001000
auto sig = subs.getGenericSignature();
1001-
return SubstitutionMap::get(sig,
1002-
QueryReplacementTypeArray{sig, newSubs},
1003-
LookUpConformanceInModule());
1001+
return SubstitutionMap::get(sig, newSubs, LookUpConformanceInModule());
10041002
}
10051003

10061004
CanType transformSILField(CanType fieldTy, TypePosition pos) {

lib/AST/SubstitutionMap.cpp

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,28 @@ SubstitutionMap SubstitutionMap::get(GenericSignature genericSig,
166166
SubstitutionMap SubstitutionMap::get(GenericSignature genericSig,
167167
ArrayRef<Type> types,
168168
LookupConformanceFn lookupConformance) {
169-
return get(genericSig,
170-
QueryReplacementTypeArray{genericSig, types},
171-
lookupConformance);
169+
QueryReplacementTypeArray subs{genericSig, types};
170+
InFlightSubstitution IFS(subs, lookupConformance, std::nullopt);
171+
return get(genericSig, types, IFS);
172+
}
173+
174+
SubstitutionMap SubstitutionMap::get(GenericSignature genericSig,
175+
ArrayRef<Type> types,
176+
InFlightSubstitution &IFS) {
177+
// Form the stored conformances.
178+
SmallVector<ProtocolConformanceRef, 4> conformances;
179+
for (const auto &req : genericSig.getRequirements()) {
180+
if (req.getKind() != RequirementKind::Conformance) continue;
181+
182+
CanType depTy = req.getFirstType()->getCanonicalType();
183+
auto replacement = depTy.subst(IFS);
184+
auto *proto = req.getProtocolDecl();
185+
auto conformance = IFS.lookupConformance(depTy, replacement, proto,
186+
/*level=*/0);
187+
conformances.push_back(conformance);
188+
}
189+
190+
return SubstitutionMap(genericSig, types, conformances);
172191
}
173192

174193
SubstitutionMap SubstitutionMap::get(GenericSignature genericSig,
@@ -192,20 +211,7 @@ SubstitutionMap SubstitutionMap::get(GenericSignature genericSig,
192211
replacementTypes.push_back(replacement);
193212
}
194213

195-
// Form the stored conformances.
196-
SmallVector<ProtocolConformanceRef, 4> conformances;
197-
for (const auto &req : genericSig.getRequirements()) {
198-
if (req.getKind() != RequirementKind::Conformance) continue;
199-
200-
CanType depTy = req.getFirstType()->getCanonicalType();
201-
auto replacement = depTy.subst(IFS);
202-
auto *proto = req.getProtocolDecl();
203-
auto conformance = IFS.lookupConformance(depTy, replacement, proto,
204-
/*level=*/0);
205-
conformances.push_back(conformance);
206-
}
207-
208-
return SubstitutionMap(genericSig, replacementTypes, conformances);
214+
return SubstitutionMap::get(genericSig, replacementTypes, IFS);
209215
}
210216

211217
Type SubstitutionMap::lookupSubstitution(GenericTypeParamType *genericParam) const {

lib/AST/TypeSubstitution.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -808,8 +808,7 @@ SubstitutionMap TypeBase::getContextSubstitutionMap() {
808808
std::reverse(replacementTypes.begin(), replacementTypes.end());
809809

810810
auto subMap = SubstitutionMap::get(
811-
genericSig,
812-
QueryReplacementTypeArray{genericSig, replacementTypes},
811+
genericSig, replacementTypes,
813812
LookUpConformanceInModule());
814813

815814
nominalTy->ContextSubMap = subMap;

0 commit comments

Comments
 (0)