@@ -133,7 +133,6 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks,
133133 bool ShouldCompleteCallPatternAfterParen = true ;
134134 bool PreferFunctionReferencesToCalls = false ;
135135 bool AttTargetIsIndependent = false ;
136- bool IsAtStartOfLine = false ;
137136 llvm::Optional<DeclKind> AttTargetDK;
138137 llvm::Optional<StmtKind> ParentStmtKind;
139138
@@ -583,6 +582,7 @@ void CodeCompletionCallbacksImpl::completeLabeledTrailingClosure(
583582 CodeCompleteTokenExpr = E;
584583 Kind = CompletionKind::LabeledTrailingClosure;
585584 IsAtStartOfLine = isAtStartOfLine;
585+ ShouldCompleteCallPatternAfterParen = false ;
586586}
587587
588588void CodeCompletionCallbacksImpl::completeReturnStmt (CodeCompletionExpr *E) {
@@ -1491,6 +1491,43 @@ bool CodeCompletionCallbacksImpl::trySolverCompletion(bool MaybeFuncBody) {
14911491
14921492 Lookup.collectResults (DotLoc, isInsideObjCSelector (), IncludeOperators,
14931493 HasSpace, CompletionContext);
1494+
1495+ // Check if we are completing after a call that already has a trailing
1496+ // closure. In that case, also suggest labels for additional trailing
1497+ // closures.
1498+ if (auto AE = dyn_cast<ApplyExpr>(ParsedExpr)) {
1499+ if (AE->getArgs ()->hasAnyTrailingClosures ()) {
1500+ ASTContext &Ctx = CurDeclContext->getASTContext ();
1501+
1502+ // Modify the call that has the code completion expression as an
1503+ // additional argument, restore the original arguments afterwards.
1504+ auto OriginalArgs = AE->getArgs ();
1505+ llvm::SmallVector<Argument> ArgsWithCC (OriginalArgs->begin (),
1506+ OriginalArgs->end ());
1507+ auto CC = new (Ctx) CodeCompletionExpr (CodeCompleteTokenExpr->getLoc ());
1508+ ArgsWithCC.emplace_back (SourceLoc (), Identifier (), CC);
1509+ auto ArgList =
1510+ ArgumentList::create (Ctx, OriginalArgs->getLParenLoc (), ArgsWithCC,
1511+ OriginalArgs->getRParenLoc (),
1512+ OriginalArgs->getFirstTrailingClosureIndex (),
1513+ OriginalArgs->isImplicit ());
1514+ AE->setArgs (ArgList);
1515+ SWIFT_DEFER { AE->setArgs (OriginalArgs); };
1516+
1517+ // Perform argument label completions on the newly created call.
1518+ ArgumentTypeCheckCompletionCallback Lookup (CC, CurDeclContext);
1519+
1520+ llvm::SaveAndRestore<TypeCheckCompletionCallback *> CompletionCollector (
1521+ Context.CompletionCallback , &Lookup);
1522+ typeCheckContextAt (
1523+ TypeCheckASTNodeAtLocContext::node (CurDeclContext, AE),
1524+ CompletionLoc);
1525+ Lookup.collectResults (/* IncludeSignature=*/ false ,
1526+ /* IsLabeledTrailingClosure=*/ true , CompletionLoc,
1527+ CurDeclContext, CompletionContext);
1528+ }
1529+ }
1530+
14941531 Consumer.handleResults (CompletionContext);
14951532 return true ;
14961533 }
@@ -1521,14 +1558,19 @@ bool CodeCompletionCallbacksImpl::trySolverCompletion(bool MaybeFuncBody) {
15211558 return true ;
15221559 }
15231560 case CompletionKind::PostfixExprParen:
1524- case CompletionKind::CallArg: {
1561+ case CompletionKind::CallArg:
1562+ case CompletionKind::LabeledTrailingClosure: {
1563+ // FIXME: Delete LabeledTrailingClosure
15251564 assert (CodeCompleteTokenExpr);
15261565 assert (CurDeclContext);
15271566 ArgumentTypeCheckCompletionCallback Lookup (CodeCompleteTokenExpr,
15281567 CurDeclContext);
15291568 typeCheckWithLookup (Lookup);
15301569
1531- Lookup.collectResults (ShouldCompleteCallPatternAfterParen, CompletionLoc,
1570+ bool IsLabeledTrailingClosure =
1571+ (Kind == CompletionKind::LabeledTrailingClosure);
1572+ Lookup.collectResults (ShouldCompleteCallPatternAfterParen,
1573+ IsLabeledTrailingClosure, CompletionLoc,
15321574 CurDeclContext, CompletionContext);
15331575 Consumer.handleResults (CompletionContext);
15341576 return true ;
@@ -1691,12 +1733,6 @@ void CodeCompletionCallbacksImpl::doneParsing(SourceFile *SrcFile) {
16911733 if (PreferFunctionReferencesToCalls)
16921734 Lookup.setPreferFunctionReferencesToCalls ();
16931735
1694- auto DoPostfixExprBeginning = [&] (){
1695- SourceLoc Loc = P.Context .SourceMgr .getIDEInspectionTargetLoc ();
1696- Lookup.getValueCompletionsInDeclContext (Loc);
1697- Lookup.getSelfTypeCompletionInDeclContext (Loc, /* isForDeclResult=*/ false );
1698- };
1699-
17001736 switch (Kind) {
17011737 case CompletionKind::None:
17021738 case CompletionKind::DotExpr:
0 commit comments