Skip to content

Commit 6c5ac51

Browse files
authored
Merge pull request #63490 from ahoppen/ahoppen/split-ideinspection
Split IDEInspectionCallbacks into CodeCompletionCallbacks and DoneParsingCallback
2 parents 93e25d2 + b52fdb9 commit 6c5ac51

15 files changed

+249
-203
lines changed

include/swift/IDE/CompletionLookup.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
614614
void collectPrecedenceGroups();
615615

616616
void getPrecedenceGroupCompletions(
617-
IDEInspectionCallbacks::PrecedenceGroupCompletionKind SK);
617+
CodeCompletionCallbacks::PrecedenceGroupCompletionKind SK);
618618

619619
void getPoundAvailablePlatformCompletions();
620620

include/swift/Parse/IDEInspectionCallbacks.h

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ enum class ObjCSelectorContext {
3030
};
3131

3232
/// Parser's interface to code completion.
33-
class IDEInspectionCallbacks {
33+
class CodeCompletionCallbacks {
3434
protected:
3535
Parser &P;
3636
ASTContext &Context;
@@ -55,11 +55,9 @@ class IDEInspectionCallbacks {
5555
std::vector<Expr *> leadingSequenceExprs;
5656

5757
public:
58-
IDEInspectionCallbacks(Parser &P)
59-
: P(P), Context(P.Context) {
60-
}
58+
CodeCompletionCallbacks(Parser &P) : P(P), Context(P.Context) {}
6159

62-
virtual ~IDEInspectionCallbacks() {}
60+
virtual ~CodeCompletionCallbacks() {}
6361

6462
bool isInsideObjCSelector() const {
6563
return CompleteExprSelectorContext != ObjCSelectorContext::None;
@@ -81,10 +79,10 @@ class IDEInspectionCallbacks {
8179
}
8280

8381
class InEnumElementRawValueRAII {
84-
IDEInspectionCallbacks *Callbacks;
82+
CodeCompletionCallbacks *Callbacks;
8583

8684
public:
87-
InEnumElementRawValueRAII(IDEInspectionCallbacks *Callbacks)
85+
InEnumElementRawValueRAII(CodeCompletionCallbacks *Callbacks)
8886
: Callbacks(Callbacks) {
8987
if (Callbacks)
9088
Callbacks->InEnumElementRawValue = true;
@@ -99,10 +97,10 @@ class IDEInspectionCallbacks {
9997
/// RAII type that temporarily sets the "in Objective-C #selector expression"
10098
/// flag on the code completion callbacks object.
10199
class InObjCSelectorExprRAII {
102-
IDEInspectionCallbacks *Callbacks;
100+
CodeCompletionCallbacks *Callbacks;
103101

104102
public:
105-
InObjCSelectorExprRAII(IDEInspectionCallbacks *Callbacks,
103+
InObjCSelectorExprRAII(CodeCompletionCallbacks *Callbacks,
106104
ObjCSelectorContext SelectorContext)
107105
: Callbacks(Callbacks) {
108106
if (Callbacks)
@@ -251,20 +249,31 @@ class IDEInspectionCallbacks {
251249
virtual void completeTypeAttrBeginning() {};
252250

253251
virtual void completeOptionalBinding(){};
252+
};
253+
254+
class DoneParsingCallback {
255+
public:
256+
virtual ~DoneParsingCallback() {}
254257

255258
/// Signals that the AST for the all the delayed-parsed code was
256259
/// constructed. No \c complete*() callbacks will be done after this.
257260
virtual void doneParsing(SourceFile *SrcFile) = 0;
258261
};
259262

260-
/// A factory to create instances of \c IDEInspectionCallbacks.
263+
/// A factory to create instances of \c CodeCompletionCallbacks and
264+
/// \c DoneParsingCallback.
261265
class IDEInspectionCallbacksFactory {
262266
public:
263267
virtual ~IDEInspectionCallbacksFactory() {}
264268

269+
struct Callbacks {
270+
std::shared_ptr<CodeCompletionCallbacks> CompletionCallbacks;
271+
std::shared_ptr<DoneParsingCallback> DoneParsingCallback;
272+
};
273+
265274
/// Create an instance of \c IDEInspectionCallbacks. The result
266275
/// should be deallocated with 'delete'.
267-
virtual IDEInspectionCallbacks *createIDEInspectionCallbacks(Parser &P) = 0;
276+
virtual Callbacks createCallbacks(Parser &P) = 0;
268277
};
269278

270279
} // namespace swift

include/swift/Parse/Parser.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ namespace llvm {
4141

4242
namespace swift {
4343
class IdentTypeRepr;
44-
class IDEInspectionCallbacks;
44+
class CodeCompletionCallbacks;
45+
class DoneParsingCallback;
4546
class IDEInspectionCallbacksFactory;
4647
class DefaultArgumentInitializer;
4748
class DiagnosticEngine;
@@ -129,7 +130,8 @@ class Parser {
129130
std::unique_ptr<PersistentParserState> OwnedState;
130131
DeclContext *CurDeclContext;
131132
ASTContext &Context;
132-
IDEInspectionCallbacks *IDECallbacks = nullptr;
133+
CodeCompletionCallbacks *CodeCompletionCallbacks = nullptr;
134+
DoneParsingCallback *DoneParsingCallback = nullptr;
133135
std::vector<Located<std::vector<ParamDecl*>>> AnonClosureVars;
134136

135137
/// The current token hash, or \c None if the parser isn't computing a hash
@@ -163,12 +165,16 @@ class Parser {
163165
/// the #if decl.
164166
bool shouldEvaluatePoundIfDecls() const;
165167

166-
void setIDECallbacks(IDEInspectionCallbacks *Callbacks) {
167-
IDECallbacks = Callbacks;
168+
void setCodeCompletionCallbacks(class CodeCompletionCallbacks *Callbacks) {
169+
CodeCompletionCallbacks = Callbacks;
170+
}
171+
172+
void setDoneParsingCallback(class DoneParsingCallback *Callback) {
173+
this->DoneParsingCallback = Callback;
168174
}
169175

170176
bool isIDEInspectionFirstPass() const {
171-
return SourceMgr.hasIDEInspectionTargetBuffer() && !IDECallbacks;
177+
return SourceMgr.hasIDEInspectionTargetBuffer() && !DoneParsingCallback;
172178
}
173179

174180
bool allowTopLevelCode() const;

lib/IDE/CodeCompletion.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ std::string swift::ide::removeCodeCompletionTokens(
103103

104104
namespace {
105105

106-
class CodeCompletionCallbacksImpl : public IDEInspectionCallbacks {
106+
class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks,
107+
public DoneParsingCallback {
107108
CodeCompletionContext &CompletionContext;
108109
CodeCompletionConsumer &Consumer;
109110
CodeCompletionExpr *CodeCompleteTokenExpr = nullptr;
@@ -123,7 +124,7 @@ class CodeCompletionCallbacksImpl : public IDEInspectionCallbacks {
123124
/// In situations when \c SyntaxKind hints or determines
124125
/// completions, i.e. a precedence group attribute, this
125126
/// can be set and used to control the code completion scenario.
126-
IDEInspectionCallbacks::PrecedenceGroupCompletionKind SyntxKind;
127+
CodeCompletionCallbacks::PrecedenceGroupCompletionKind SyntxKind;
127128

128129
int AttrParamIndex;
129130
bool IsInSil = false;
@@ -233,9 +234,8 @@ class CodeCompletionCallbacksImpl : public IDEInspectionCallbacks {
233234
CodeCompletionCallbacksImpl(Parser &P,
234235
CodeCompletionContext &CompletionContext,
235236
CodeCompletionConsumer &Consumer)
236-
: IDEInspectionCallbacks(P), CompletionContext(CompletionContext),
237-
Consumer(Consumer) {
238-
}
237+
: CodeCompletionCallbacks(P), DoneParsingCallback(),
238+
CompletionContext(CompletionContext), Consumer(Consumer) {}
239239

240240
void setAttrTargetDeclKind(Optional<DeclKind> DK) override {
241241
if (DK == DeclKind::PatternBinding)
@@ -273,7 +273,7 @@ class CodeCompletionCallbacksImpl : public IDEInspectionCallbacks {
273273
void completeDeclAttrParam(DeclAttrKind DK, int Index) override;
274274
void completeEffectsSpecifier(bool hasAsync, bool hasThrows) override;
275275
void completeInPrecedenceGroup(
276-
IDEInspectionCallbacks::PrecedenceGroupCompletionKind SK) override;
276+
CodeCompletionCallbacks::PrecedenceGroupCompletionKind SK) override;
277277
void completeNominalMemberBeginning(
278278
SmallVectorImpl<StringRef> &Keywords, SourceLoc introducerLoc) override;
279279
void completeAccessorBeginning(CodeCompletionExpr *E) override;
@@ -484,7 +484,7 @@ void CodeCompletionCallbacksImpl::completeDeclAttrBeginning(
484484
}
485485

486486
void CodeCompletionCallbacksImpl::completeInPrecedenceGroup(
487-
IDEInspectionCallbacks::PrecedenceGroupCompletionKind SK) {
487+
CodeCompletionCallbacks::PrecedenceGroupCompletionKind SK) {
488488
assert(P.Tok.is(tok::code_complete));
489489

490490
SyntxKind = SK;
@@ -1480,7 +1480,7 @@ bool CodeCompletionCallbacksImpl::trySolverCompletion(bool MaybeFuncBody) {
14801480
case CompletionKind::KeyPathExprSwift: {
14811481
assert(CurDeclContext);
14821482

1483-
// IDEInspectionCallbacks::completeExprKeyPath takes a \c KeyPathExpr,
1483+
// CodeCompletionCallbacks::completeExprKeyPath takes a \c KeyPathExpr,
14841484
// so we can safely cast the \c ParsedExpr back to a \c KeyPathExpr.
14851485
auto KeyPath = cast<KeyPathExpr>(ParsedExpr);
14861486
KeyPathTypeCheckCompletionCallback Lookup(KeyPath);
@@ -2040,8 +2040,10 @@ class CodeCompletionCallbacksFactoryImpl
20402040
CodeCompletionConsumer &Consumer)
20412041
: CompletionContext(CompletionContext), Consumer(Consumer) {}
20422042

2043-
IDEInspectionCallbacks *createIDEInspectionCallbacks(Parser &P) override {
2044-
return new CodeCompletionCallbacksImpl(P, CompletionContext, Consumer);
2043+
Callbacks createCallbacks(Parser &P) override {
2044+
auto callbacks = std::make_shared<CodeCompletionCallbacksImpl>(
2045+
P, CompletionContext, Consumer);
2046+
return {callbacks, callbacks};
20452047
}
20462048
};
20472049
} // end anonymous namespace

lib/IDE/CompletionLookup.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3053,26 +3053,26 @@ void CompletionLookup::collectPrecedenceGroups() {
30533053
}
30543054

30553055
void CompletionLookup::getPrecedenceGroupCompletions(
3056-
IDEInspectionCallbacks::PrecedenceGroupCompletionKind SK) {
3056+
CodeCompletionCallbacks::PrecedenceGroupCompletionKind SK) {
30573057
switch (SK) {
3058-
case IDEInspectionCallbacks::PrecedenceGroupCompletionKind::Associativity:
3058+
case CodeCompletionCallbacks::PrecedenceGroupCompletionKind::Associativity:
30593059
addKeyword(getAssociativitySpelling(Associativity::None));
30603060
addKeyword(getAssociativitySpelling(Associativity::Left));
30613061
addKeyword(getAssociativitySpelling(Associativity::Right));
30623062
return;
3063-
case IDEInspectionCallbacks::PrecedenceGroupCompletionKind::Assignment:
3063+
case CodeCompletionCallbacks::PrecedenceGroupCompletionKind::Assignment:
30643064
addKeyword(getTokenText(tok::kw_false), Type(), SemanticContextKind::None,
30653065
CodeCompletionKeywordKind::kw_false);
30663066
addKeyword(getTokenText(tok::kw_true), Type(), SemanticContextKind::None,
30673067
CodeCompletionKeywordKind::kw_true);
30683068
return;
3069-
case IDEInspectionCallbacks::PrecedenceGroupCompletionKind::AttributeList:
3069+
case CodeCompletionCallbacks::PrecedenceGroupCompletionKind::AttributeList:
30703070
addKeyword("associativity");
30713071
addKeyword("higherThan");
30723072
addKeyword("lowerThan");
30733073
addKeyword("assignment");
30743074
return;
3075-
case IDEInspectionCallbacks::PrecedenceGroupCompletionKind::Relation:
3075+
case CodeCompletionCallbacks::PrecedenceGroupCompletionKind::Relation:
30763076
collectPrecedenceGroups();
30773077
return;
30783078
}

lib/IDE/ConformingMethodList.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ using namespace swift;
2525
using namespace ide;
2626

2727
namespace {
28-
class ConformingMethodListCallbacks : public IDEInspectionCallbacks {
28+
class ConformingMethodListCallbacks : public CodeCompletionCallbacks,
29+
public DoneParsingCallback {
2930
ArrayRef<const char *> ExpectedTypeNames;
3031
ConformingMethodListConsumer &Consumer;
3132
SourceLoc Loc;
@@ -40,8 +41,8 @@ class ConformingMethodListCallbacks : public IDEInspectionCallbacks {
4041
ConformingMethodListCallbacks(Parser &P,
4142
ArrayRef<const char *> ExpectedTypeNames,
4243
ConformingMethodListConsumer &Consumer)
43-
: IDEInspectionCallbacks(P), ExpectedTypeNames(ExpectedTypeNames),
44-
Consumer(Consumer) {}
44+
: CodeCompletionCallbacks(P), DoneParsingCallback(),
45+
ExpectedTypeNames(ExpectedTypeNames), Consumer(Consumer) {}
4546

4647
// Only handle callbacks for suffix completions.
4748
// {
@@ -190,8 +191,10 @@ swift::ide::makeConformingMethodListCallbacksFactory(
190191
ConformingMethodListConsumer &Consumer)
191192
: ExpectedTypeNames(ExpectedTypeNames), Consumer(Consumer) {}
192193

193-
IDEInspectionCallbacks *createIDEInspectionCallbacks(Parser &P) override {
194-
return new ConformingMethodListCallbacks(P, ExpectedTypeNames, Consumer);
194+
Callbacks createCallbacks(Parser &P) override {
195+
auto Callback = std::make_shared<ConformingMethodListCallbacks>(
196+
P, ExpectedTypeNames, Consumer);
197+
return {Callback, Callback};
195198
}
196199
};
197200

lib/IDE/CursorInfo.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -318,15 +318,14 @@ class CursorInfoTypeCheckSolutionCallback : public TypeCheckCompletionCallback {
318318

319319
// MARK: - CursorInfoDoneParsingCallback
320320

321-
class CursorInfoDoneParsingCallback : public IDEInspectionCallbacks {
321+
class CursorInfoDoneParsingCallback : public DoneParsingCallback {
322322
CursorInfoConsumer &Consumer;
323323
SourceLoc RequestedLoc;
324324

325325
public:
326326
CursorInfoDoneParsingCallback(Parser &P, CursorInfoConsumer &Consumer,
327327
SourceLoc RequestedLoc)
328-
: IDEInspectionCallbacks(P), Consumer(Consumer),
329-
RequestedLoc(RequestedLoc) {}
328+
: DoneParsingCallback(), Consumer(Consumer), RequestedLoc(RequestedLoc) {}
330329

331330
ResolvedCursorInfoPtr getDeclResult(NodeFinderDeclResult *DeclResult,
332331
SourceFile *SrcFile,
@@ -439,8 +438,10 @@ swift::ide::makeCursorInfoCallbacksFactory(CursorInfoConsumer &Consumer,
439438
SourceLoc RequestedLoc)
440439
: Consumer(Consumer), RequestedLoc(RequestedLoc) {}
441440

442-
IDEInspectionCallbacks *createIDEInspectionCallbacks(Parser &P) override {
443-
return new CursorInfoDoneParsingCallback(P, Consumer, RequestedLoc);
441+
Callbacks createCallbacks(Parser &P) override {
442+
auto Callback = std::make_shared<CursorInfoDoneParsingCallback>(
443+
P, Consumer, RequestedLoc);
444+
return {nullptr, Callback};
444445
}
445446
};
446447

lib/IDE/TypeContextInfo.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
using namespace swift;
2727
using namespace ide;
2828

29-
class ContextInfoCallbacks : public IDEInspectionCallbacks {
29+
class ContextInfoCallbacks : public CodeCompletionCallbacks,
30+
public DoneParsingCallback {
3031
TypeContextInfoConsumer &Consumer;
3132
SourceLoc Loc;
3233
Expr *ParsedExpr = nullptr;
@@ -36,7 +37,7 @@ class ContextInfoCallbacks : public IDEInspectionCallbacks {
3637

3738
public:
3839
ContextInfoCallbacks(Parser &P, TypeContextInfoConsumer &Consumer)
39-
: IDEInspectionCallbacks(P), Consumer(Consumer) {}
40+
: CodeCompletionCallbacks(P), DoneParsingCallback(), Consumer(Consumer) {}
4041

4142
void completePostfixExprBeginning(CodeCompletionExpr *E) override;
4243
void completeForEachSequenceBeginning(CodeCompletionExpr *E) override;
@@ -211,8 +212,9 @@ IDEInspectionCallbacksFactory *swift::ide::makeTypeContextInfoCallbacksFactory(
211212
ContextInfoCallbacksFactoryImpl(TypeContextInfoConsumer &Consumer)
212213
: Consumer(Consumer) {}
213214

214-
IDEInspectionCallbacks *createIDEInspectionCallbacks(Parser &P) override {
215-
return new ContextInfoCallbacks(P, Consumer);
215+
Callbacks createCallbacks(Parser &P) override {
216+
auto Callbacks = std::make_shared<ContextInfoCallbacks>(P, Consumer);
217+
return {Callbacks, Callbacks};
216218
}
217219
};
218220

0 commit comments

Comments
 (0)