Skip to content

Commit 1baa1f4

Browse files
committed
[CodeCompletion] Extract common implementation of sawSolution and fallbackTypeCheck to TypeCheckCompletionCallback
1 parent 6d97905 commit 1baa1f4

8 files changed

+44
-46
lines changed

include/swift/IDE/DotExprCompletion.h

+3-10
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,17 @@ class DotExprTypeCheckCompletionCallback : public TypeCheckCompletionCallback {
3333
bool IsImplicitSingleExpressionReturn;
3434
};
3535

36-
DeclContext *DC;
3736
CodeCompletionExpr *CompletionExpr;
3837
SmallVector<Result, 4> Results;
3938
llvm::DenseMap<std::pair<Type, Decl *>, size_t> BaseToSolutionIdx;
40-
bool GotCallback = false;
4139

4240
public:
43-
DotExprTypeCheckCompletionCallback(DeclContext *DC,
44-
CodeCompletionExpr *CompletionExpr)
45-
: DC(DC), CompletionExpr(CompletionExpr) {}
46-
47-
/// True if at least one solution was passed via the \c sawSolution
48-
/// callback.
49-
bool gotCallback() const { return GotCallback; }
41+
DotExprTypeCheckCompletionCallback(CodeCompletionExpr *CompletionExpr)
42+
: CompletionExpr(CompletionExpr) {}
5043

5144
/// Typecheck the code completion expression in isolation, calling
5245
/// \c sawSolution for each solution formed.
53-
void fallbackTypeCheck();
46+
void fallbackTypeCheck(DeclContext *DC) override;
5447

5548
void sawSolution(const constraints::Solution &solution) override;
5649

include/swift/IDE/UnresolvedMemberCompletion.h

-9
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,12 @@ class UnresolvedMemberTypeCheckCompletionCallback
3333
CodeCompletionExpr *CompletionExpr;
3434
SmallVector<ExprResult, 4> ExprResults;
3535
SmallVector<Type, 1> EnumPatternTypes;
36-
bool GotCallback = false;
3736

3837
public:
3938
UnresolvedMemberTypeCheckCompletionCallback(
4039
CodeCompletionExpr *CompletionExpr)
4140
: CompletionExpr(CompletionExpr) {}
4241

43-
/// True if at least one solution was passed via the \c sawSolution
44-
/// callback.
45-
bool gotCallback() const { return GotCallback; }
46-
47-
/// Typecheck the code completion expression in its outermost expression
48-
/// context, calling \c sawSolution for each solution formed.
49-
void fallbackTypeCheck(DeclContext *DC);
50-
5142
void sawSolution(const constraints::Solution &solution) override;
5243

5344
void deliverResults(DeclContext *DC, SourceLoc DotLoc,

include/swift/Sema/CodeCompletionTypeChecking.h

+15-2
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,24 @@ namespace swift {
3636
}
3737

3838
class TypeCheckCompletionCallback {
39+
bool GotCallback = false;
40+
3941
public:
42+
virtual ~TypeCheckCompletionCallback() {}
43+
4044
/// Called for each solution produced while type-checking an expression
4145
/// that the code completion expression participates in.
42-
virtual void sawSolution(const constraints::Solution &solution) = 0;
43-
virtual ~TypeCheckCompletionCallback() {}
46+
virtual void sawSolution(const constraints::Solution &solution) {
47+
GotCallback = true;
48+
};
49+
50+
/// True if at least one solution was passed via the \c sawSolution
51+
/// callback.
52+
bool gotCallback() const { return GotCallback; }
53+
54+
/// Typecheck the code completion expression in its outermost expression
55+
/// context, calling \c sawSolution for each solution formed.
56+
virtual void fallbackTypeCheck(DeclContext *DC);
4457
};
4558
}
4659

lib/IDE/CodeCompletion.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1333,8 +1333,7 @@ bool CodeCompletionCallbacksImpl::trySolverCompletion(bool MaybeFuncBody) {
13331333
assert(CodeCompleteTokenExpr);
13341334
assert(CurDeclContext);
13351335

1336-
DotExprTypeCheckCompletionCallback Lookup(CurDeclContext,
1337-
CodeCompleteTokenExpr);
1336+
DotExprTypeCheckCompletionCallback Lookup(CodeCompleteTokenExpr);
13381337
llvm::SaveAndRestore<TypeCheckCompletionCallback*>
13391338
CompletionCollector(Context.CompletionCallback, &Lookup);
13401339
typeCheckContextAt(CurDeclContext, CompletionLoc);
@@ -1345,7 +1344,7 @@ bool CodeCompletionCallbacksImpl::trySolverCompletion(bool MaybeFuncBody) {
13451344
// typechecking still resolve even these cases would be beneficial for
13461345
// tooling in general though.
13471346
if (!Lookup.gotCallback())
1348-
Lookup.fallbackTypeCheck();
1347+
Lookup.fallbackTypeCheck(CurDeclContext);
13491348

13501349
addKeywords(CompletionContext.getResultSink(), MaybeFuncBody);
13511350

lib/IDE/DotExprCompletion.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ using namespace swift;
2121
using namespace swift::constraints;
2222
using namespace swift::ide;
2323

24-
void DotExprTypeCheckCompletionCallback::fallbackTypeCheck() {
24+
void DotExprTypeCheckCompletionCallback::fallbackTypeCheck(DeclContext *DC) {
2525
assert(!gotCallback());
2626

2727
// Default to checking the completion expression in isolation.
@@ -46,7 +46,7 @@ void DotExprTypeCheckCompletionCallback::fallbackTypeCheck() {
4646

4747
void DotExprTypeCheckCompletionCallback::sawSolution(
4848
const constraints::Solution &S) {
49-
GotCallback = true;
49+
TypeCheckCompletionCallback::sawSolution(S);
5050
auto &CS = S.getConstraintSystem();
5151
auto *ParsedExpr = CompletionExpr->getBase();
5252
auto *SemanticExpr = ParsedExpr->getSemanticsProvidingExpr();

lib/IDE/KeyPathCompletion.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ using namespace swift::ide;
2121

2222
void KeyPathTypeCheckCompletionCallback::sawSolution(
2323
const constraints::Solution &S) {
24+
TypeCheckCompletionCallback::sawSolution(S);
25+
2426
// Determine the code completion.
2527
size_t ComponentIndex = 0;
2628
for (auto &Component : KeyPath->getComponents()) {

lib/IDE/UnresolvedMemberCompletion.cpp

+1-20
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ static VarDecl *getMatchVarIfInPatternMatch(CodeCompletionExpr *CompletionExpr,
8282

8383
void UnresolvedMemberTypeCheckCompletionCallback::sawSolution(
8484
const constraints::Solution &S) {
85-
GotCallback = true;
85+
TypeCheckCompletionCallback::sawSolution(S);
8686

8787
auto &CS = S.getConstraintSystem();
8888
Type ExpectedTy = getTypeForCompletion(S, CompletionExpr);
@@ -119,25 +119,6 @@ void UnresolvedMemberTypeCheckCompletionCallback::sawSolution(
119119
}
120120
}
121121

122-
void UnresolvedMemberTypeCheckCompletionCallback::fallbackTypeCheck(
123-
DeclContext *DC) {
124-
assert(!gotCallback());
125-
126-
CompletionContextFinder finder(DC);
127-
if (!finder.hasCompletionExpr())
128-
return;
129-
130-
auto fallback = finder.getFallbackCompletionExpr();
131-
if (!fallback)
132-
return;
133-
134-
SolutionApplicationTarget completionTarget(fallback->E, fallback->DC,
135-
CTP_Unused, Type(),
136-
/*isDiscared=*/true);
137-
typeCheckForCodeCompletion(completionTarget, /*needsPrecheck*/ true,
138-
[&](const Solution &S) { sawSolution(S); });
139-
}
140-
141122
void UnresolvedMemberTypeCheckCompletionCallback::deliverResults(
142123
DeclContext *DC, SourceLoc DotLoc,
143124
ide::CodeCompletionContext &CompletionCtx,

lib/Sema/TypeCheckCodeCompletion.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -848,3 +848,22 @@ bool swift::isImplicitSingleExpressionReturn(ConstraintSystem &CS,
848848
}
849849
return false;
850850
}
851+
852+
void TypeCheckCompletionCallback::fallbackTypeCheck(DeclContext *DC) {
853+
assert(!GotCallback);
854+
855+
CompletionContextFinder finder(DC);
856+
if (!finder.hasCompletionExpr())
857+
return;
858+
859+
auto fallback = finder.getFallbackCompletionExpr();
860+
if (!fallback)
861+
return;
862+
863+
SolutionApplicationTarget completionTarget(fallback->E, fallback->DC,
864+
CTP_Unused, Type(),
865+
/*isDiscared=*/true);
866+
TypeChecker::typeCheckForCodeCompletion(
867+
completionTarget, /*needsPrecheck*/ true,
868+
[&](const Solution &S) { sawSolution(S); });
869+
}

0 commit comments

Comments
 (0)