Skip to content

Commit f06194b

Browse files
committed
[CodeCompletion] Enable call signature completion for unresolved member
rdar://problem/50696432 (cherry picked from commit 5b5d342)
1 parent 1d30c8b commit f06194b

File tree

4 files changed

+47
-11
lines changed

4 files changed

+47
-11
lines changed

include/swift/Parse/CodeCompletionCallbacks.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ class CodeCompletionCallbacks {
209209

210210
virtual void completeAssignmentRHS(AssignExpr *E) {};
211211

212-
virtual void completeCallArg(CodeCompletionExpr *E) {};
212+
virtual void completeCallArg(CodeCompletionExpr *E, bool isFirst) {};
213213

214214
virtual void completeReturnStmt(CodeCompletionExpr *E) {};
215215

lib/IDE/CodeCompletion.cpp

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1381,7 +1381,7 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks {
13811381
void completeUnresolvedMember(CodeCompletionExpr *E,
13821382
SourceLoc DotLoc) override;
13831383
void completeAssignmentRHS(AssignExpr *E) override;
1384-
void completeCallArg(CodeCompletionExpr *E) override;
1384+
void completeCallArg(CodeCompletionExpr *E, bool isFirst) override;
13851385
void completeReturnStmt(CodeCompletionExpr *E) override;
13861386
void completeYieldStmt(CodeCompletionExpr *E,
13871387
Optional<unsigned> yieldIndex) override;
@@ -4636,10 +4636,26 @@ void CodeCompletionCallbacksImpl::completeAssignmentRHS(AssignExpr *E) {
46364636
Kind = CompletionKind::AssignmentRHS;
46374637
}
46384638

4639-
void CodeCompletionCallbacksImpl::completeCallArg(CodeCompletionExpr *E) {
4639+
void CodeCompletionCallbacksImpl::completeCallArg(CodeCompletionExpr *E,
4640+
bool isFirst) {
46404641
CurDeclContext = P.CurDeclContext;
46414642
CodeCompleteTokenExpr = E;
46424643
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+
}
46434659
}
46444660

46454661
void CodeCompletionCallbacksImpl::completeReturnStmt(CodeCompletionExpr *E) {
@@ -5344,13 +5360,32 @@ void CodeCompletionCallbacksImpl::doneParsing() {
53445360
}
53455361
case CompletionKind::CallArg : {
53465362
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()) {
53485379
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();
53505388
}
5351-
Lookup.setExpectedTypes(ContextInfo.getPossibleTypes(),
5352-
ContextInfo.isSingleExpressionBody());
5353-
DoPostfixExprBeginning();
53545389
break;
53555390
}
53565391

lib/IDE/TypeContextInfo.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class ContextInfoCallbacks : public CodeCompletionCallbacks {
3939
void completeForEachSequenceBeginning(CodeCompletionExpr *E) override;
4040
void completeCaseStmtBeginning() override;
4141

42-
void completeCallArg(CodeCompletionExpr *E) override;
42+
void completeCallArg(CodeCompletionExpr *E, bool isFirst) override;
4343
void completeReturnStmt(CodeCompletionExpr *E) override;
4444
void completeYieldStmt(CodeCompletionExpr *E,
4545
Optional<unsigned> yieldIndex) override;
@@ -61,7 +61,8 @@ void ContextInfoCallbacks::completeForEachSequenceBeginning(
6161
CurDeclContext = P.CurDeclContext;
6262
ParsedExpr = E;
6363
}
64-
void ContextInfoCallbacks::completeCallArg(CodeCompletionExpr *E) {
64+
void ContextInfoCallbacks::completeCallArg(CodeCompletionExpr *E,
65+
bool isFirst) {
6566
CurDeclContext = P.CurDeclContext;
6667
ParsedExpr = E;
6768
}

lib/Parse/ParseExpr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3073,7 +3073,7 @@ ParserStatus Parser::parseExprList(tok leftTok, tok rightTok,
30733073
// Handle call arguments specially because it may need argument labels.
30743074
auto CCExpr = new (Context) CodeCompletionExpr(Tok.getLoc());
30753075
if (CodeCompletion)
3076-
CodeCompletion->completeCallArg(CCExpr);
3076+
CodeCompletion->completeCallArg(CCExpr, PreviousLoc == leftLoc);
30773077
consumeIf(tok::code_complete);
30783078
SubExpr = CCExpr;
30793079
Status.setHasCodeCompletion();

0 commit comments

Comments
 (0)