Skip to content

Commit ccdc91b

Browse files
committed
[NFC] Ditch SaveAndRestore for Local Resolvers
Now that TypeResolvers and TypeResolution objects are cheap and easy to create, just use them instead of emplacing resolutions into the current resolver.
1 parent d7b005f commit ccdc91b

File tree

1 file changed

+26
-28
lines changed

1 file changed

+26
-28
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2774,17 +2774,15 @@ Type TypeResolver::resolveSILBoxType(SILBoxTypeRepr *repr,
27742774
// Resolve field types using the box type's generic environment, if it
27752775
// has one. (TODO: Field types should never refer to generic parameters
27762776
// outside the box's own environment; we should really validate that...)
2777-
Optional<TypeResolution> resolveSILBoxGenericParams;
2778-
Optional<llvm::SaveAndRestore<TypeResolution>>
2779-
useSILBoxGenericEnv;
2777+
TypeResolution fieldResolution{resolution};
27802778
if (auto env = repr->getGenericEnvironment()) {
2781-
resolveSILBoxGenericParams = TypeResolution::forContextual(
2779+
fieldResolution = TypeResolution::forContextual(
27822780
getDeclContext(), env, options, resolution.getUnboundTypeOpener());
2783-
useSILBoxGenericEnv.emplace(resolution, *resolveSILBoxGenericParams);
27842781
}
2785-
2782+
2783+
TypeResolver fieldResolver{fieldResolution};
27862784
for (auto &fieldRepr : repr->getFields()) {
2787-
auto fieldTy = resolveType(fieldRepr.getFieldType(), options);
2785+
auto fieldTy = fieldResolver.resolveType(fieldRepr.getFieldType(), options);
27882786
fields.push_back({fieldTy->getCanonicalType(), fieldRepr.isMutable()});
27892787
}
27902788
}
@@ -2853,15 +2851,11 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
28532851
: genericEnv;
28542852

28552853
{
2856-
Optional<TypeResolution> resolveSILFunctionGenericParams;
2857-
Optional<llvm::SaveAndRestore<TypeResolution>> useSILFunctionGenericEnv;
2858-
2854+
TypeResolution functionResolution{resolution};
28592855
if (componentTypeEnv) {
2860-
resolveSILFunctionGenericParams = TypeResolution::forContextual(
2856+
functionResolution = TypeResolution::forContextual(
28612857
getDeclContext(), componentTypeEnv, options,
28622858
resolution.getUnboundTypeOpener());
2863-
useSILFunctionGenericEnv.emplace(resolution,
2864-
*resolveSILFunctionGenericParams);
28652859
}
28662860

28672861
auto argsTuple = repr->getArgsTypeRepr();
@@ -2875,10 +2869,11 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
28752869
diagnose(element.UnderscoreLoc, diag::sil_function_input_label);
28762870
}
28772871

2872+
TypeResolver silResolver{functionResolution};
28782873
for (auto elt : argsTuple->getElements()) {
28792874
auto elementOptions = options;
28802875
elementOptions.setContext(TypeResolverContext::FunctionInput);
2881-
auto param = resolveSILParameter(elt.Type, elementOptions);
2876+
auto param = silResolver.resolveSILParameter(elt.Type, elementOptions);
28822877
params.push_back(param);
28832878

28842879
if (!param.getInterfaceType() || param.getInterfaceType()->hasError())
@@ -2887,8 +2882,9 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
28872882

28882883
{
28892884
// FIXME: Deal with unsatisfied dependencies.
2890-
if (resolveSILResults(repr->getResultTypeRepr(), options, yields,
2891-
results, errorResult)) {
2885+
if (silResolver.resolveSILResults(repr->getResultTypeRepr(),
2886+
options, yields,
2887+
results, errorResult)) {
28922888
hasError = true;
28932889
}
28942890

@@ -2899,15 +2895,16 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
28992895
hasError = true;
29002896
}
29012897
}
2902-
} // restore generic type resolution
2898+
}
29032899

29042900
auto resolveSubstitutions = [&](GenericEnvironment *env,
2905-
ArrayRef<TypeRepr*> args) {
2901+
ArrayRef<TypeRepr*> args,
2902+
TypeResolver &&parameterResolver) {
29062903
auto sig = env->getGenericSignature().getCanonicalSignature();
29072904
TypeSubstitutionMap subsMap;
29082905
auto params = sig->getGenericParams();
29092906
for (unsigned i : indices(args)) {
2910-
auto resolved = resolveType(args[i], options);
2907+
auto resolved = parameterResolver.resolveType(args[i], options);
29112908
subsMap.insert({params[i], resolved->getCanonicalType()});
29122909
}
29132910
return SubstitutionMap::get(
@@ -2920,25 +2917,26 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
29202917
// applicable.
29212918
SubstitutionMap patternSubs;
29222919
if (!repr->getPatternSubstitutions().empty()) {
2923-
Optional<TypeResolution> resolveSILFunctionGenericParams;
2924-
Optional<llvm::SaveAndRestore<TypeResolution>> useSILFunctionGenericEnv;
29252920
if (genericEnv) {
2926-
resolveSILFunctionGenericParams =
2921+
auto resolveSILParameters =
29272922
TypeResolution::forContextual(getDeclContext(), genericEnv, options,
29282923
resolution.getUnboundTypeOpener());
2929-
useSILFunctionGenericEnv.emplace(resolution,
2930-
*resolveSILFunctionGenericParams);
2924+
patternSubs = resolveSubstitutions(repr->getPatternGenericEnvironment(),
2925+
repr->getPatternSubstitutions(),
2926+
TypeResolver{resolveSILParameters});
2927+
} else {
2928+
patternSubs = resolveSubstitutions(repr->getPatternGenericEnvironment(),
2929+
repr->getPatternSubstitutions(),
2930+
TypeResolver{resolution});
29312931
}
2932-
2933-
patternSubs = resolveSubstitutions(repr->getPatternGenericEnvironment(),
2934-
repr->getPatternSubstitutions());
29352932
}
29362933

29372934
// Resolve invocation substitutions if we have them.
29382935
SubstitutionMap invocationSubs;
29392936
if (!repr->getInvocationSubstitutions().empty()) {
29402937
invocationSubs = resolveSubstitutions(repr->getGenericEnvironment(),
2941-
repr->getInvocationSubstitutions());
2938+
repr->getInvocationSubstitutions(),
2939+
TypeResolver{resolution});
29422940
}
29432941

29442942
if (hasError) {

0 commit comments

Comments
 (0)