@@ -150,7 +150,7 @@ namespace {
150
150
151
151
Type performTypeResolution(TypeRepr *TyR, bool IsSILType,
152
152
GenericEnvironment *GenericEnv,
153
- GenericParamList *GenericParams);
153
+ GenericParamList *GenericParams) const ;
154
154
155
155
void convertRequirements(ArrayRef<RequirementRepr> From,
156
156
SmallVectorImpl<Requirement> &To);
@@ -915,9 +915,8 @@ void SILParser::convertRequirements(ArrayRef<RequirementRepr> From,
915
915
// Use parser lexical scopes to resolve references
916
916
// to the generic parameters.
917
917
auto ResolveToInterfaceType = [&](TypeRepr *TyR) -> Type {
918
- return performTypeResolution(TyR, /*IsSILType=*/false,
919
- ContextGenericEnv, ContextGenericParams)
920
- ->mapTypeOutOfContext();
918
+ return performTypeResolution(TyR, /*IsSILType=*/false, ContextGenericEnv,
919
+ ContextGenericParams);
921
920
};
922
921
923
922
for (auto &Req : From) {
@@ -1187,7 +1186,7 @@ static bool parseDeclSILOptional(bool *isTransparent,
1187
1186
1188
1187
Type SILParser::performTypeResolution(TypeRepr *TyR, bool IsSILType,
1189
1188
GenericEnvironment *GenericEnv,
1190
- GenericParamList *GenericParams) {
1189
+ GenericParamList *GenericParams) const {
1191
1190
if (GenericEnv == nullptr)
1192
1191
GenericEnv = ContextGenericEnv;
1193
1192
@@ -1251,26 +1250,26 @@ bool SILParser::parseASTType(CanType &result,
1251
1250
ParserResult<TypeRepr> parsedType = P.parseType();
1252
1251
if (parsedType.isNull()) return true;
1253
1252
1254
- bool wantInterfaceType = true ;
1253
+ bool wantContextualType = false ;
1255
1254
if (genericEnv == nullptr) {
1256
1255
genericEnv = ContextGenericEnv;
1257
- wantInterfaceType = false ;
1256
+ wantContextualType = true ;
1258
1257
}
1259
1258
if (genericParams == nullptr)
1260
1259
genericParams = ContextGenericParams;
1261
1260
1262
1261
bindSILGenericParams(parsedType.get());
1263
1262
1264
- const auto resolvedType =
1265
- performTypeResolution(parsedType.get(), /*isSILType=*/false,
1266
- genericEnv, genericParams);
1263
+ auto resolvedType = performTypeResolution(
1264
+ parsedType.get(), /*isSILType=*/false, genericEnv, genericParams);
1265
+ if (wantContextualType && genericEnv) {
1266
+ resolvedType = genericEnv->mapTypeIntoContext(resolvedType);
1267
+ }
1268
+
1267
1269
if (resolvedType->hasError())
1268
1270
return true;
1269
1271
1270
- if (wantInterfaceType)
1271
- result = resolvedType->mapTypeOutOfContext()->getCanonicalType();
1272
- else
1273
- result = resolvedType->getCanonicalType();
1272
+ result = resolvedType->getCanonicalType();
1274
1273
1275
1274
return false;
1276
1275
}
@@ -1363,9 +1362,12 @@ bool SILParser::parseSILType(SILType &Result,
1363
1362
auto *attrRepr =
1364
1363
P.applyAttributeToType(
1365
1364
TyR.get(), attrs, specifier, specifierLoc, isolatedLoc);
1366
- const auto Ty =
1367
- performTypeResolution(attrRepr, /*IsSILType=*/true,
1368
- OuterGenericEnv, OuterGenericParams);
1365
+ auto Ty = performTypeResolution(attrRepr, /*IsSILType=*/true, OuterGenericEnv,
1366
+ OuterGenericParams);
1367
+ if (OuterGenericEnv) {
1368
+ Ty = OuterGenericEnv->mapTypeIntoContext(Ty);
1369
+ }
1370
+
1369
1371
if (Ty->hasError())
1370
1372
return true;
1371
1373
@@ -1930,9 +1932,12 @@ bool SILParser::parseSubstitutions(SmallVectorImpl<ParsedSubstitution> &parsed,
1930
1932
if (TyR.isNull())
1931
1933
return true;
1932
1934
1933
- const auto Ty =
1934
- performTypeResolution(TyR.get(), /*IsSILType=*/false,
1935
- GenericEnv, GenericParams);
1935
+ auto Ty = performTypeResolution(TyR.get(), /*IsSILType=*/false, GenericEnv,
1936
+ GenericParams);
1937
+ if (GenericEnv) {
1938
+ Ty = GenericEnv->mapTypeIntoContext(Ty);
1939
+ }
1940
+
1936
1941
if (Ty->hasError())
1937
1942
return true;
1938
1943
parsed.push_back({Loc, Ty});
@@ -2321,9 +2326,8 @@ bool SILParser::parseSILDeclRef(SILDeclRef &Member, bool FnTypeRequired) {
2321
2326
genericParams = fnType->getGenericParams();
2322
2327
}
2323
2328
2324
- const auto Ty =
2325
- performTypeResolution(TyR.get(), /*IsSILType=*/false,
2326
- genericEnv, genericParams);
2329
+ const auto Ty = performTypeResolution(TyR.get(), /*IsSILType=*/false,
2330
+ genericEnv, genericParams);
2327
2331
if (Ty->hasError())
2328
2332
return true;
2329
2333
@@ -6841,9 +6845,12 @@ ProtocolConformanceRef SILParser::parseProtocolConformanceHelper(
6841
6845
if (witnessParams == nullptr)
6842
6846
witnessParams = ContextGenericParams;
6843
6847
6844
- const auto ConformingTy =
6845
- performTypeResolution(TyR.get(), /*IsSILType=*/false,
6846
- witnessEnv, witnessParams);
6848
+ auto ConformingTy = performTypeResolution(TyR.get(), /*IsSILType=*/false,
6849
+ witnessEnv, witnessParams);
6850
+ if (witnessEnv) {
6851
+ ConformingTy = witnessEnv->mapTypeIntoContext(ConformingTy);
6852
+ }
6853
+
6847
6854
if (ConformingTy->hasError())
6848
6855
return ProtocolConformanceRef();
6849
6856
@@ -6957,13 +6964,17 @@ static bool parseSILWitnessTableEntry(
6957
6964
if (TyR.isNull())
6958
6965
return true;
6959
6966
6960
- const auto Ty =
6967
+ auto Ty =
6961
6968
swift::performTypeResolution(TyR.get(), P.Context,
6962
6969
/*isSILMode=*/false,
6963
6970
/*isSILType=*/false,
6964
6971
witnessEnv,
6965
6972
witnessParams,
6966
6973
&P.SF);
6974
+ if (witnessEnv) {
6975
+ Ty = witnessEnv->mapTypeIntoContext(Ty);
6976
+ }
6977
+
6967
6978
if (Ty->hasError())
6968
6979
return true;
6969
6980
@@ -7018,12 +7029,16 @@ static bool parseSILWitnessTableEntry(
7018
7029
if (TyR.isNull())
7019
7030
return true;
7020
7031
7021
- const auto Ty =
7032
+ auto Ty =
7022
7033
swift::performTypeResolution(TyR.get(), P.Context,
7023
7034
/*isSILMode=*/false,
7024
7035
/*isSILType=*/false,
7025
7036
witnessEnv, witnessParams,
7026
7037
&P.SF);
7038
+ if (witnessEnv) {
7039
+ Ty = witnessEnv->mapTypeIntoContext(Ty);
7040
+ }
7041
+
7027
7042
if (Ty->hasError())
7028
7043
return true;
7029
7044
0 commit comments