@@ -1381,7 +1381,7 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks {
1381
1381
void completeUnresolvedMember (CodeCompletionExpr *E,
1382
1382
SourceLoc DotLoc) override ;
1383
1383
void completeAssignmentRHS (AssignExpr *E) override ;
1384
- void completeCallArg (CodeCompletionExpr *E) override ;
1384
+ void completeCallArg (CodeCompletionExpr *E, bool isFirst ) override ;
1385
1385
void completeReturnStmt (CodeCompletionExpr *E) override ;
1386
1386
void completeYieldStmt (CodeCompletionExpr *E,
1387
1387
Optional<unsigned > yieldIndex) override ;
@@ -4636,10 +4636,26 @@ void CodeCompletionCallbacksImpl::completeAssignmentRHS(AssignExpr *E) {
4636
4636
Kind = CompletionKind::AssignmentRHS;
4637
4637
}
4638
4638
4639
- void CodeCompletionCallbacksImpl::completeCallArg (CodeCompletionExpr *E) {
4639
+ void CodeCompletionCallbacksImpl::completeCallArg (CodeCompletionExpr *E,
4640
+ bool isFirst) {
4640
4641
CurDeclContext = P.CurDeclContext ;
4641
4642
CodeCompleteTokenExpr = E;
4642
4643
Kind = CompletionKind::CallArg;
4644
+
4645
+ ShouldCompleteCallPatternAfterParen = false ;
4646
+ if (isFirst) {
4647
+ ShouldCompleteCallPatternAfterParen = true ;
4648
+ if (Context.LangOpts .CodeCompleteCallPatternHeuristics ) {
4649
+ // Lookahead one token to decide what kind of call completions to provide.
4650
+ // When it appears that there is already code for the call present, just
4651
+ // complete values and/or argument labels. Otherwise give the entire call
4652
+ // pattern.
4653
+ Token next = P.peekToken ();
4654
+ if (!next.isAtStartOfLine () && !next.is (tok::eof) && !next.is (tok::r_paren)) {
4655
+ ShouldCompleteCallPatternAfterParen = false ;
4656
+ }
4657
+ }
4658
+ }
4643
4659
}
4644
4660
4645
4661
void CodeCompletionCallbacksImpl::completeReturnStmt (CodeCompletionExpr *E) {
@@ -5344,13 +5360,32 @@ void CodeCompletionCallbacksImpl::doneParsing() {
5344
5360
}
5345
5361
case CompletionKind::CallArg : {
5346
5362
ExprContextInfo ContextInfo (CurDeclContext, CodeCompleteTokenExpr);
5347
- if (!ContextInfo.getPossibleNames ().empty ()) {
5363
+
5364
+ bool shouldPerformGlobalCompletion = true ;
5365
+
5366
+ if (ShouldCompleteCallPatternAfterParen &&
5367
+ !ContextInfo.getPossibleCallees ().empty ()) {
5368
+ Lookup.setHaveLParen (true );
5369
+ for (auto &typeAndDecl : ContextInfo.getPossibleCallees ())
5370
+ Lookup.tryFunctionCallCompletions (typeAndDecl.first ,
5371
+ typeAndDecl.second );
5372
+ Lookup.setHaveLParen (false );
5373
+
5374
+ shouldPerformGlobalCompletion =
5375
+ !Lookup.FoundFunctionCalls ||
5376
+ (Lookup.FoundFunctionCalls &&
5377
+ Lookup.FoundFunctionsWithoutFirstKeyword );
5378
+ } else if (!ContextInfo.getPossibleNames ().empty ()) {
5348
5379
Lookup.addArgNameCompletionResults (ContextInfo.getPossibleNames ());
5349
- break ;
5380
+
5381
+ shouldPerformGlobalCompletion = !ContextInfo.getPossibleTypes ().empty ();
5382
+ }
5383
+
5384
+ if (shouldPerformGlobalCompletion) {
5385
+ Lookup.setExpectedTypes (ContextInfo.getPossibleTypes (),
5386
+ ContextInfo.isSingleExpressionBody ());
5387
+ DoPostfixExprBeginning ();
5350
5388
}
5351
- Lookup.setExpectedTypes (ContextInfo.getPossibleTypes (),
5352
- ContextInfo.isSingleExpressionBody ());
5353
- DoPostfixExprBeginning ();
5354
5389
break ;
5355
5390
}
5356
5391
0 commit comments