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