Skip to content

Commit 5b5d342

Browse files
committed
[CodeCompletion] Enable call signature completion for unresolved member
rdar://problem/50696432
1 parent 14d2f7c commit 5b5d342

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
@@ -1379,7 +1379,7 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks {
13791379
void completeUnresolvedMember(CodeCompletionExpr *E,
13801380
SourceLoc DotLoc) override;
13811381
void completeAssignmentRHS(AssignExpr *E) override;
1382-
void completeCallArg(CodeCompletionExpr *E) override;
1382+
void completeCallArg(CodeCompletionExpr *E, bool isFirst) override;
13831383
void completeReturnStmt(CodeCompletionExpr *E) override;
13841384
void completeYieldStmt(CodeCompletionExpr *E,
13851385
Optional<unsigned> yieldIndex) override;
@@ -4633,10 +4633,26 @@ void CodeCompletionCallbacksImpl::completeAssignmentRHS(AssignExpr *E) {
46334633
Kind = CompletionKind::AssignmentRHS;
46344634
}
46354635

4636-
void CodeCompletionCallbacksImpl::completeCallArg(CodeCompletionExpr *E) {
4636+
void CodeCompletionCallbacksImpl::completeCallArg(CodeCompletionExpr *E,
4637+
bool isFirst) {
46374638
CurDeclContext = P.CurDeclContext;
46384639
CodeCompleteTokenExpr = E;
46394640
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+
}
46404656
}
46414657

46424658
void CodeCompletionCallbacksImpl::completeReturnStmt(CodeCompletionExpr *E) {
@@ -5341,13 +5357,32 @@ void CodeCompletionCallbacksImpl::doneParsing() {
53415357
}
53425358
case CompletionKind::CallArg : {
53435359
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()) {
53455376
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();
53475385
}
5348-
Lookup.setExpectedTypes(ContextInfo.getPossibleTypes(),
5349-
ContextInfo.isSingleExpressionBody());
5350-
DoPostfixExprBeginning();
53515386
break;
53525387
}
53535388

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
@@ -3043,7 +3043,7 @@ ParserStatus Parser::parseExprList(tok leftTok, tok rightTok,
30433043
// Handle call arguments specially because it may need argument labels.
30443044
auto CCExpr = new (Context) CodeCompletionExpr(Tok.getLoc());
30453045
if (CodeCompletion)
3046-
CodeCompletion->completeCallArg(CCExpr);
3046+
CodeCompletion->completeCallArg(CCExpr, PreviousLoc == leftLoc);
30473047
consumeIf(tok::code_complete);
30483048
SubExpr = CCExpr;
30493049
Status.setHasCodeCompletion();

0 commit comments

Comments
 (0)