@@ -1105,8 +1105,10 @@ constraints::getCompletionArgInfo(ASTNode anchor, ConstraintSystem &CS) {
11051105class ArgumentFailureTracker : public MatchCallArgumentListener {
11061106protected:
11071107 ConstraintSystem &CS;
1108+ NullablePtr<ValueDecl> Callee;
11081109 SmallVectorImpl<AnyFunctionType::Param> &Arguments;
11091110 ArrayRef<AnyFunctionType::Param> Parameters;
1111+ Optional<unsigned> UnlabeledTrailingClosureArgIndex;
11101112 ConstraintLocatorBuilder Locator;
11111113
11121114private:
@@ -1138,11 +1140,14 @@ class ArgumentFailureTracker : public MatchCallArgumentListener {
11381140 }
11391141
11401142public:
1141- ArgumentFailureTracker(ConstraintSystem &cs,
1143+ ArgumentFailureTracker(ConstraintSystem &cs, ValueDecl *callee,
11421144 SmallVectorImpl<AnyFunctionType::Param> &args,
11431145 ArrayRef<AnyFunctionType::Param> params,
1146+ Optional<unsigned> unlabeledTrailingClosureArgIndex,
11441147 ConstraintLocatorBuilder locator)
1145- : CS(cs), Arguments(args), Parameters(params), Locator(locator) {}
1148+ : CS(cs), Callee(callee), Arguments(args), Parameters(params),
1149+ UnlabeledTrailingClosureArgIndex(unlabeledTrailingClosureArgIndex),
1150+ Locator(locator) {}
11461151
11471152 ~ArgumentFailureTracker() override {
11481153 if (!MissingArguments.empty()) {
@@ -1172,6 +1177,19 @@ class ArgumentFailureTracker : public MatchCallArgumentListener {
11721177 if (!CS.shouldAttemptFixes())
11731178 return true;
11741179
1180+ // If this is a trailing closure, let's check if the call is
1181+ // to an init of a callable type. If so, let's not record it
1182+ // as extraneous since it would be matched against implicitly
1183+ // injected `.callAsFunction` call.
1184+ if (UnlabeledTrailingClosureArgIndex &&
1185+ argIdx == *UnlabeledTrailingClosureArgIndex && Callee) {
1186+ if (auto *ctor = dyn_cast<ConstructorDecl>(Callee.get())) {
1187+ auto resultTy = ctor->getResultInterfaceType();
1188+ if (resultTy->isCallableNominalType(CS.DC))
1189+ return true;
1190+ }
1191+ }
1192+
11751193 ExtraArguments.push_back(std::make_pair(argIdx, Arguments[argIdx]));
11761194 return false;
11771195 }
@@ -1280,12 +1298,15 @@ class CompletionArgumentTracker : public ArgumentFailureTracker {
12801298 struct CompletionArgInfo ArgInfo;
12811299
12821300public:
1283- CompletionArgumentTracker(ConstraintSystem &cs,
1301+ CompletionArgumentTracker(ConstraintSystem &cs, ValueDecl *callee,
12841302 SmallVectorImpl<AnyFunctionType::Param> &args,
12851303 ArrayRef<AnyFunctionType::Param> params,
1304+ Optional<unsigned> unlabeledTrailingClosureArgIndex,
12861305 ConstraintLocatorBuilder locator,
12871306 struct CompletionArgInfo ArgInfo)
1288- : ArgumentFailureTracker(cs, args, params, locator), ArgInfo(ArgInfo) {}
1307+ : ArgumentFailureTracker(cs, callee, args, params,
1308+ unlabeledTrailingClosureArgIndex, locator),
1309+ ArgInfo(ArgInfo) {}
12891310
12901311 Optional<unsigned> missingArgument(unsigned paramIdx,
12911312 unsigned argInsertIdx) override {
@@ -1695,14 +1716,16 @@ static ConstraintSystem::TypeMatchResult matchCallArguments(
16951716 if (cs.isForCodeCompletion()) {
16961717 if (auto completionInfo = getCompletionArgInfo(locator.getAnchor(), cs)) {
16971718 listener = std::make_unique<CompletionArgumentTracker>(
1698- cs, argsWithLabels, params, locator, *completionInfo);
1719+ cs, callee, argsWithLabels, params,
1720+ argList->getFirstTrailingClosureIndex(), locator, *completionInfo);
16991721 }
17001722 }
17011723 if (!listener) {
17021724 // We didn't create an argument tracker for code completion. Create a
17031725 // normal one.
1704- listener = std::make_unique<ArgumentFailureTracker>(cs, argsWithLabels,
1705- params, locator);
1726+ listener = std::make_unique<ArgumentFailureTracker>(
1727+ cs, callee, argsWithLabels, params,
1728+ argList->getFirstTrailingClosureIndex(), locator);
17061729 }
17071730 auto callArgumentMatch = constraints::matchCallArguments(
17081731 argsWithLabels, params, paramInfo,
0 commit comments