@@ -2774,17 +2774,15 @@ Type TypeResolver::resolveSILBoxType(SILBoxTypeRepr *repr,
2774
2774
// Resolve field types using the box type's generic environment, if it
2775
2775
// has one. (TODO: Field types should never refer to generic parameters
2776
2776
// 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};
2780
2778
if (auto env = repr->getGenericEnvironment ()) {
2781
- resolveSILBoxGenericParams = TypeResolution::forContextual (
2779
+ fieldResolution = TypeResolution::forContextual (
2782
2780
getDeclContext (), env, options, resolution.getUnboundTypeOpener ());
2783
- useSILBoxGenericEnv.emplace (resolution, *resolveSILBoxGenericParams);
2784
2781
}
2785
-
2782
+
2783
+ TypeResolver fieldResolver{fieldResolution};
2786
2784
for (auto &fieldRepr : repr->getFields ()) {
2787
- auto fieldTy = resolveType (fieldRepr.getFieldType (), options);
2785
+ auto fieldTy = fieldResolver. resolveType (fieldRepr.getFieldType (), options);
2788
2786
fields.push_back ({fieldTy->getCanonicalType (), fieldRepr.isMutable ()});
2789
2787
}
2790
2788
}
@@ -2853,15 +2851,11 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
2853
2851
: genericEnv;
2854
2852
2855
2853
{
2856
- Optional<TypeResolution> resolveSILFunctionGenericParams;
2857
- Optional<llvm::SaveAndRestore<TypeResolution>> useSILFunctionGenericEnv;
2858
-
2854
+ TypeResolution functionResolution{resolution};
2859
2855
if (componentTypeEnv) {
2860
- resolveSILFunctionGenericParams = TypeResolution::forContextual (
2856
+ functionResolution = TypeResolution::forContextual (
2861
2857
getDeclContext (), componentTypeEnv, options,
2862
2858
resolution.getUnboundTypeOpener ());
2863
- useSILFunctionGenericEnv.emplace (resolution,
2864
- *resolveSILFunctionGenericParams);
2865
2859
}
2866
2860
2867
2861
auto argsTuple = repr->getArgsTypeRepr ();
@@ -2875,10 +2869,11 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
2875
2869
diagnose (element.UnderscoreLoc , diag::sil_function_input_label);
2876
2870
}
2877
2871
2872
+ TypeResolver silResolver{functionResolution};
2878
2873
for (auto elt : argsTuple->getElements ()) {
2879
2874
auto elementOptions = options;
2880
2875
elementOptions.setContext (TypeResolverContext::FunctionInput);
2881
- auto param = resolveSILParameter (elt.Type , elementOptions);
2876
+ auto param = silResolver. resolveSILParameter (elt.Type , elementOptions);
2882
2877
params.push_back (param);
2883
2878
2884
2879
if (!param.getInterfaceType () || param.getInterfaceType ()->hasError ())
@@ -2887,8 +2882,9 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
2887
2882
2888
2883
{
2889
2884
// 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)) {
2892
2888
hasError = true ;
2893
2889
}
2894
2890
@@ -2899,15 +2895,16 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
2899
2895
hasError = true ;
2900
2896
}
2901
2897
}
2902
- } // restore generic type resolution
2898
+ }
2903
2899
2904
2900
auto resolveSubstitutions = [&](GenericEnvironment *env,
2905
- ArrayRef<TypeRepr*> args) {
2901
+ ArrayRef<TypeRepr*> args,
2902
+ TypeResolver &¶meterResolver) {
2906
2903
auto sig = env->getGenericSignature ().getCanonicalSignature ();
2907
2904
TypeSubstitutionMap subsMap;
2908
2905
auto params = sig->getGenericParams ();
2909
2906
for (unsigned i : indices (args)) {
2910
- auto resolved = resolveType (args[i], options);
2907
+ auto resolved = parameterResolver. resolveType (args[i], options);
2911
2908
subsMap.insert ({params[i], resolved->getCanonicalType ()});
2912
2909
}
2913
2910
return SubstitutionMap::get (
@@ -2920,25 +2917,26 @@ Type TypeResolver::resolveSILFunctionType(FunctionTypeRepr *repr,
2920
2917
// applicable.
2921
2918
SubstitutionMap patternSubs;
2922
2919
if (!repr->getPatternSubstitutions ().empty ()) {
2923
- Optional<TypeResolution> resolveSILFunctionGenericParams;
2924
- Optional<llvm::SaveAndRestore<TypeResolution>> useSILFunctionGenericEnv;
2925
2920
if (genericEnv) {
2926
- resolveSILFunctionGenericParams =
2921
+ auto resolveSILParameters =
2927
2922
TypeResolution::forContextual (getDeclContext (), genericEnv, options,
2928
2923
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});
2931
2931
}
2932
-
2933
- patternSubs = resolveSubstitutions (repr->getPatternGenericEnvironment (),
2934
- repr->getPatternSubstitutions ());
2935
2932
}
2936
2933
2937
2934
// Resolve invocation substitutions if we have them.
2938
2935
SubstitutionMap invocationSubs;
2939
2936
if (!repr->getInvocationSubstitutions ().empty ()) {
2940
2937
invocationSubs = resolveSubstitutions (repr->getGenericEnvironment (),
2941
- repr->getInvocationSubstitutions ());
2938
+ repr->getInvocationSubstitutions (),
2939
+ TypeResolver{resolution});
2942
2940
}
2943
2941
2944
2942
if (hasError) {
0 commit comments