@@ -1428,9 +1428,16 @@ static bool isRequirementOrWitness(const ConstraintLocatorBuilder &locator) {
14281428
14291429AnyFunctionType *ConstraintSystem::adjustFunctionTypeForConcurrency (
14301430 AnyFunctionType *fnType, ValueDecl *decl, DeclContext *dc,
1431- unsigned numApplies, bool isMainDispatchQueue) {
1431+ unsigned numApplies, bool isMainDispatchQueue,
1432+ OpenedTypeMap &replacements) {
14321433 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+ });
14341441}
14351442
14361443// / For every parameter in \p type that has an error type, replace that
@@ -1479,11 +1486,6 @@ ConstraintSystem::getTypeOfReference(ValueDecl *value,
14791486
14801487 AnyFunctionType *funcType = func->getInterfaceType ()
14811488 ->castTo <AnyFunctionType>();
1482- if (!isRequirementOrWitness (locator)) {
1483- unsigned numApplies = getNumApplications (value, false , functionRefKind);
1484- funcType = adjustFunctionTypeForConcurrency (
1485- funcType, func, useDC, numApplies, false );
1486- }
14871489 auto openedType = openFunctionType (
14881490 funcType, locator, replacements, func->getDeclContext ());
14891491
@@ -1500,6 +1502,13 @@ ConstraintSystem::getTypeOfReference(ValueDecl *value,
15001502 ->castTo <FunctionType>();
15011503 }
15021504
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+
15031512 // The reference implicitly binds 'self'.
15041513 return {openedType, openedType->getResult ()};
15051514 }
@@ -1512,20 +1521,20 @@ ConstraintSystem::getTypeOfReference(ValueDecl *value,
15121521 auto numLabelsToRemove = getNumRemovedArgumentLabels (
15131522 funcDecl, /* isCurriedInstanceReference=*/ false , functionRefKind);
15141523
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;
15151530 if (!isRequirementOrWitness (locator)) {
15161531 unsigned numApplies = getNumApplications (
15171532 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));
15201536 }
15211537
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-
15291538 if (isForCodeCompletion () && openedType->hasError ()) {
15301539 // In code completion, replace error types by placeholder types so we can
15311540 // match the types we know instead of bailing out completely.
@@ -2096,22 +2105,13 @@ ConstraintSystem::getTypeOfMemberReference(
20962105
20972106 AnyFunctionType *funcType;
20982107
2099- if (isa<AbstractFunctionDecl>(value) ||
2100- isa<EnumElementDecl>(value)) {
2108+ if (isa<AbstractFunctionDecl>(value) || isa<EnumElementDecl>(value)) {
21012109 if (auto ErrorTy = value->getInterfaceType ()->getAs <ErrorType>()) {
21022110 return {ErrorType::get (ErrorTy->getASTContext ()),
21032111 ErrorType::get (ErrorTy->getASTContext ())};
21042112 }
21052113 // This is the easy case.
21062114 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- }
21152115 } else {
21162116 // For a property, build a type (Self) -> PropType.
21172117 // For a subscript, build a type (Self) -> (Indices...) -> ElementType.
@@ -2128,11 +2128,7 @@ ConstraintSystem::getTypeOfMemberReference(
21282128 ->castTo <AnyFunctionType>()->getParams ();
21292129 // FIXME: Verify ExtInfo state is correct, not working by accident.
21302130 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);
21362132 } else {
21372133 refType = getUnopenedTypeOfReference (cast<VarDecl>(value), baseTy, useDC,
21382134 locator,
@@ -2244,6 +2240,22 @@ ConstraintSystem::getTypeOfMemberReference(
22442240 FunctionType::get (fullFunctionType->getParams (), functionType, info);
22452241 }
22462242
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+
22472259 // Compute the type of the reference.
22482260 Type type = openedType;
22492261
@@ -2456,6 +2468,7 @@ Type ConstraintSystem::getEffectiveOverloadType(ConstraintLocator *locator,
24562468 uncurryLevel);
24572469 };
24582470
2471+ OpenedTypeMap emptyReplacements;
24592472 if (auto subscript = dyn_cast<SubscriptDecl>(decl)) {
24602473 auto elementTy = subscript->getElementInterfaceType ();
24612474
@@ -2478,7 +2491,8 @@ Type ConstraintSystem::getEffectiveOverloadType(ConstraintLocator *locator,
24782491 FunctionType::ExtInfo info;
24792492 type = adjustFunctionTypeForConcurrency (
24802493 FunctionType::get (indices, elementTy, info),
2481- subscript, useDC, /* numApplies=*/ 1 , /* isMainDispatchQueue=*/ false );
2494+ subscript, useDC, /* numApplies=*/ 1 , /* isMainDispatchQueue=*/ false ,
2495+ emptyReplacements);
24822496 } else if (auto var = dyn_cast<VarDecl>(decl)) {
24832497 type = var->getValueInterfaceType ();
24842498 if (doesStorageProduceLValue (var, overload.getBaseType (), useDC)) {
@@ -2524,7 +2538,8 @@ Type ConstraintSystem::getEffectiveOverloadType(ConstraintLocator *locator,
25242538
25252539 type = adjustFunctionTypeForConcurrency (
25262540 type->castTo <FunctionType>(),
2527- decl, useDC, numApplies, /* isMainDispatchQueue=*/ false )
2541+ decl, useDC, numApplies, /* isMainDispatchQueue=*/ false ,
2542+ emptyReplacements)
25282543 ->getResult ();
25292544 }
25302545 }
0 commit comments