@@ -1428,9 +1428,16 @@ static bool isRequirementOrWitness(const ConstraintLocatorBuilder &locator) {
1428
1428
1429
1429
AnyFunctionType *ConstraintSystem::adjustFunctionTypeForConcurrency (
1430
1430
AnyFunctionType *fnType, ValueDecl *decl, DeclContext *dc,
1431
- unsigned numApplies, bool isMainDispatchQueue) {
1431
+ unsigned numApplies, bool isMainDispatchQueue,
1432
+ OpenedTypeMap &replacements) {
1432
1433
return swift::adjustFunctionTypeForConcurrency (
1433
- fnType, decl, dc, numApplies, isMainDispatchQueue, GetClosureType{*this });
1434
+ fnType, decl, dc, numApplies, isMainDispatchQueue, GetClosureType{*this },
1435
+ [&](Type type) {
1436
+ if (replacements.empty ())
1437
+ return type;
1438
+
1439
+ return openType (type, replacements);
1440
+ });
1434
1441
}
1435
1442
1436
1443
// / For every parameter in \p type that has an error type, replace that
@@ -1479,11 +1486,6 @@ ConstraintSystem::getTypeOfReference(ValueDecl *value,
1479
1486
1480
1487
AnyFunctionType *funcType = func->getInterfaceType ()
1481
1488
->castTo <AnyFunctionType>();
1482
- if (!isRequirementOrWitness (locator)) {
1483
- unsigned numApplies = getNumApplications (value, false , functionRefKind);
1484
- funcType = adjustFunctionTypeForConcurrency (
1485
- funcType, func, useDC, numApplies, false );
1486
- }
1487
1489
auto openedType = openFunctionType (
1488
1490
funcType, locator, replacements, func->getDeclContext ());
1489
1491
@@ -1500,6 +1502,13 @@ ConstraintSystem::getTypeOfReference(ValueDecl *value,
1500
1502
->castTo <FunctionType>();
1501
1503
}
1502
1504
1505
+ auto origOpenedType = openedType;
1506
+ if (!isRequirementOrWitness (locator)) {
1507
+ unsigned numApplies = getNumApplications (value, false , functionRefKind);
1508
+ openedType = cast<FunctionType>(adjustFunctionTypeForConcurrency (
1509
+ origOpenedType, func, useDC, numApplies, false , replacements));
1510
+ }
1511
+
1503
1512
// The reference implicitly binds 'self'.
1504
1513
return {openedType, openedType->getResult ()};
1505
1514
}
@@ -1512,20 +1521,20 @@ ConstraintSystem::getTypeOfReference(ValueDecl *value,
1512
1521
auto numLabelsToRemove = getNumRemovedArgumentLabels (
1513
1522
funcDecl, /* isCurriedInstanceReference=*/ false , functionRefKind);
1514
1523
1524
+ auto openedType = openFunctionType (funcType, locator, replacements,
1525
+ funcDecl->getDeclContext ())
1526
+ ->removeArgumentLabels (numLabelsToRemove);
1527
+ openedType = unwrapPropertyWrapperParameterTypes (*this , funcDecl, functionRefKind, openedType->castTo <FunctionType>(), locator);
1528
+
1529
+ auto origOpenedType = openedType;
1515
1530
if (!isRequirementOrWitness (locator)) {
1516
1531
unsigned numApplies = getNumApplications (
1517
1532
funcDecl, false , functionRefKind);
1518
- funcType = adjustFunctionTypeForConcurrency (
1519
- funcType, funcDecl, useDC, numApplies, false );
1533
+ openedType = cast<FunctionType>(adjustFunctionTypeForConcurrency (
1534
+ origOpenedType->castTo <FunctionType>(), funcDecl, useDC,
1535
+ numApplies, false , replacements));
1520
1536
}
1521
1537
1522
- auto openedType = openFunctionType (funcType, locator, replacements,
1523
- funcDecl->getDeclContext ())
1524
- ->removeArgumentLabels (numLabelsToRemove);
1525
- openedType = unwrapPropertyWrapperParameterTypes (*this , funcDecl, functionRefKind,
1526
- openedType->getAs <FunctionType>(),
1527
- locator);
1528
-
1529
1538
if (isForCodeCompletion () && openedType->hasError ()) {
1530
1539
// In code completion, replace error types by placeholder types so we can
1531
1540
// match the types we know instead of bailing out completely.
@@ -2096,22 +2105,13 @@ ConstraintSystem::getTypeOfMemberReference(
2096
2105
2097
2106
AnyFunctionType *funcType;
2098
2107
2099
- if (isa<AbstractFunctionDecl>(value) ||
2100
- isa<EnumElementDecl>(value)) {
2108
+ if (isa<AbstractFunctionDecl>(value) || isa<EnumElementDecl>(value)) {
2101
2109
if (auto ErrorTy = value->getInterfaceType ()->getAs <ErrorType>()) {
2102
2110
return {ErrorType::get (ErrorTy->getASTContext ()),
2103
2111
ErrorType::get (ErrorTy->getASTContext ())};
2104
2112
}
2105
2113
// This is the easy case.
2106
2114
funcType = value->getInterfaceType ()->castTo <AnyFunctionType>();
2107
-
2108
- if (!isRequirementOrWitness (locator)) {
2109
- unsigned numApplies = getNumApplications (
2110
- value, hasAppliedSelf, functionRefKind);
2111
- funcType = adjustFunctionTypeForConcurrency (
2112
- funcType, value, useDC, numApplies,
2113
- isMainDispatchQueueMember (locator));
2114
- }
2115
2115
} else {
2116
2116
// For a property, build a type (Self) -> PropType.
2117
2117
// For a subscript, build a type (Self) -> (Indices...) -> ElementType.
@@ -2128,11 +2128,7 @@ ConstraintSystem::getTypeOfMemberReference(
2128
2128
->castTo <AnyFunctionType>()->getParams ();
2129
2129
// FIXME: Verify ExtInfo state is correct, not working by accident.
2130
2130
FunctionType::ExtInfo info;
2131
- auto *refFnType = FunctionType::get (indices, elementTy, info);
2132
-
2133
- refType = adjustFunctionTypeForConcurrency (
2134
- refFnType, subscript, useDC, /* numApplies=*/ 1 ,
2135
- /* isMainDispatchQueue=*/ false );
2131
+ refType = FunctionType::get (indices, elementTy, info);
2136
2132
} else {
2137
2133
refType = getUnopenedTypeOfReference (cast<VarDecl>(value), baseTy, useDC,
2138
2134
locator,
@@ -2244,6 +2240,22 @@ ConstraintSystem::getTypeOfMemberReference(
2244
2240
FunctionType::get (fullFunctionType->getParams (), functionType, info);
2245
2241
}
2246
2242
2243
+ // Adjust the type for concurrency.
2244
+ Type origOpenedType = openedType;
2245
+
2246
+ if ((isa<AbstractFunctionDecl>(value) || isa<EnumElementDecl>(value)) &&
2247
+ !isRequirementOrWitness (locator)) {
2248
+ unsigned numApplies = getNumApplications (
2249
+ value, hasAppliedSelf, functionRefKind);
2250
+ openedType = adjustFunctionTypeForConcurrency (
2251
+ origOpenedType->castTo <AnyFunctionType>(), value, useDC, numApplies,
2252
+ isMainDispatchQueueMember (locator), replacements);
2253
+ } else if (auto subscript = dyn_cast<SubscriptDecl>(value)) {
2254
+ openedType = adjustFunctionTypeForConcurrency (
2255
+ origOpenedType->castTo <AnyFunctionType>(), subscript, useDC,
2256
+ /* numApplies=*/ 2 , /* isMainDispatchQueue=*/ false , replacements);
2257
+ }
2258
+
2247
2259
// Compute the type of the reference.
2248
2260
Type type = openedType;
2249
2261
@@ -2456,6 +2468,7 @@ Type ConstraintSystem::getEffectiveOverloadType(ConstraintLocator *locator,
2456
2468
uncurryLevel);
2457
2469
};
2458
2470
2471
+ OpenedTypeMap emptyReplacements;
2459
2472
if (auto subscript = dyn_cast<SubscriptDecl>(decl)) {
2460
2473
auto elementTy = subscript->getElementInterfaceType ();
2461
2474
@@ -2478,7 +2491,8 @@ Type ConstraintSystem::getEffectiveOverloadType(ConstraintLocator *locator,
2478
2491
FunctionType::ExtInfo info;
2479
2492
type = adjustFunctionTypeForConcurrency (
2480
2493
FunctionType::get (indices, elementTy, info),
2481
- subscript, useDC, /* numApplies=*/ 1 , /* isMainDispatchQueue=*/ false );
2494
+ subscript, useDC, /* numApplies=*/ 1 , /* isMainDispatchQueue=*/ false ,
2495
+ emptyReplacements);
2482
2496
} else if (auto var = dyn_cast<VarDecl>(decl)) {
2483
2497
type = var->getValueInterfaceType ();
2484
2498
if (doesStorageProduceLValue (var, overload.getBaseType (), useDC)) {
@@ -2524,7 +2538,8 @@ Type ConstraintSystem::getEffectiveOverloadType(ConstraintLocator *locator,
2524
2538
2525
2539
type = adjustFunctionTypeForConcurrency (
2526
2540
type->castTo <FunctionType>(),
2527
- decl, useDC, numApplies, /* isMainDispatchQueue=*/ false )
2541
+ decl, useDC, numApplies, /* isMainDispatchQueue=*/ false ,
2542
+ emptyReplacements)
2528
2543
->getResult ();
2529
2544
}
2530
2545
}
0 commit comments