Skip to content

Commit

Permalink
[CodeCompletion] Pass the CodeCompletionExpr rather than just the bas…
Browse files Browse the repository at this point in the history
…e expression to the DotExpr completion callback.
  • Loading branch information
nathawes committed Aug 29, 2020
1 parent 3e8278a commit cf60b2f
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 10 deletions.
2 changes: 1 addition & 1 deletion include/swift/Parse/CodeCompletionCallbacks.h
Expand Up @@ -119,7 +119,7 @@ class CodeCompletionCallbacks {
virtual void setAttrTargetDeclKind(Optional<DeclKind> DK) {}

/// Complete expr-dot after we have consumed the dot.
virtual void completeDotExpr(Expr *E, SourceLoc DotLoc) {};
virtual void completeDotExpr(CodeCompletionExpr *E, SourceLoc DotLoc) {};

/// Complete the beginning of a statement or expression.
virtual void completeStmtOrExpr(CodeCompletionExpr *E) {};
Expand Down
8 changes: 5 additions & 3 deletions lib/IDE/CodeCompletion.cpp
Expand Up @@ -1660,7 +1660,7 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks {
AttTargetDK = DK;
}

void completeDotExpr(Expr *E, SourceLoc DotLoc) override;
void completeDotExpr(CodeCompletionExpr *E, SourceLoc DotLoc) override;
void completeStmtOrExpr(CodeCompletionExpr *E) override;
void completePostfixExprBeginning(CodeCompletionExpr *E) override;
void completeForEachSequenceBeginning(CodeCompletionExpr *E) override;
Expand Down Expand Up @@ -5153,7 +5153,8 @@ static void addSelectorModifierKeywords(CodeCompletionResultSink &sink) {
addKeyword("setter", CodeCompletionKeywordKind::None);
}

void CodeCompletionCallbacksImpl::completeDotExpr(Expr *E, SourceLoc DotLoc) {
void CodeCompletionCallbacksImpl::completeDotExpr(CodeCompletionExpr *E,
SourceLoc DotLoc) {
assert(P.Tok.is(tok::code_complete));

// Don't produce any results in an enum element.
Expand All @@ -5166,9 +5167,10 @@ void CodeCompletionCallbacksImpl::completeDotExpr(Expr *E, SourceLoc DotLoc) {
CompleteExprSelectorContext = ParseExprSelectorContext;
}

ParsedExpr = E;
ParsedExpr = E->getBase();
this->DotLoc = DotLoc;
CurDeclContext = P.CurDeclContext;
CodeCompleteTokenExpr = E;
}

void CodeCompletionCallbacksImpl::completeStmtOrExpr(CodeCompletionExpr *E) {
Expand Down
7 changes: 4 additions & 3 deletions lib/IDE/ConformingMethodList.cpp
Expand Up @@ -45,16 +45,17 @@ class ConformingMethodListCallbacks : public CodeCompletionCallbacks {

// Only handle callbacks for suffix completions.
// {
void completeDotExpr(Expr *E, SourceLoc DotLoc) override;
void completeDotExpr(CodeCompletionExpr *E, SourceLoc DotLoc) override;
void completePostfixExpr(Expr *E, bool hasSpace) override;
// }

void doneParsing() override;
};

void ConformingMethodListCallbacks::completeDotExpr(Expr *E, SourceLoc DotLoc) {
void ConformingMethodListCallbacks::completeDotExpr(CodeCompletionExpr *E,
SourceLoc DotLoc) {
CurDeclContext = P.CurDeclContext;
ParsedExpr = E;
ParsedExpr = E->getBase();
}

void ConformingMethodListCallbacks::completePostfixExpr(Expr *E,
Expand Down
7 changes: 4 additions & 3 deletions lib/Parse/ParseExpr.cpp
Expand Up @@ -1157,11 +1157,12 @@ Parser::parseExprPostfixSuffix(ParserResult<Expr> Result, bool isExprBasic,
// Handle "x.<tab>" for code completion.
if (Tok.is(tok::code_complete)) {
assert(!InSwiftKeyPath);
auto CCExpr = new (Context) CodeCompletionExpr(Result.get(),
Tok.getLoc());
if (CodeCompletion) {
CodeCompletion->completeDotExpr(Result.get(), /*DotLoc=*/TokLoc);
CodeCompletion->completeDotExpr(CCExpr, /*DotLoc=*/TokLoc);
}
auto CCExpr = new (Context) CodeCompletionExpr(Result.get(),
consumeToken(tok::code_complete));
consumeToken(tok::code_complete);
return makeParserCodeCompletionResult(CCExpr);
}

Expand Down

0 comments on commit cf60b2f

Please sign in to comment.