Skip to content

Commit de9806e

Browse files
committed
[SourceKit] Introduce key for cancelling on close
Defaults to `true`.
1 parent 69f2e26 commit de9806e

File tree

7 files changed

+31
-24
lines changed

7 files changed

+31
-24
lines changed

tools/SourceKit/include/SourceKit/Core/LangSupport.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1105,7 +1105,8 @@ class LangSupport {
11051105
SourceKitCancellationToken CancellationToken,
11061106
std::shared_ptr<EditorConsumer> Consumer) = 0;
11071107

1108-
virtual void editorClose(StringRef Name, bool RemoveCache) = 0;
1108+
virtual void editorClose(StringRef Name, bool CancelBuilds,
1109+
bool RemoveCache) = 0;
11091110

11101111
virtual void editorReplaceText(StringRef Name, llvm::MemoryBuffer *Buf,
11111112
unsigned Offset, unsigned Length,

tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2447,26 +2447,25 @@ void SwiftLangSupport::editorOpen(StringRef Name, llvm::MemoryBuffer *Buf,
24472447
// EditorClose
24482448
//===----------------------------------------------------------------------===//
24492449

2450-
void SwiftLangSupport::editorClose(StringRef Name, bool RemoveCache) {
2450+
void SwiftLangSupport::editorClose(StringRef Name, bool CancelBuilds,
2451+
bool RemoveCache) {
24512452
auto Removed = EditorDocuments->remove(Name);
2452-
if (Removed) {
2453-
--Stats->numOpenDocs;
2454-
} else {
2453+
if (!Removed) {
2454+
// FIXME: Report error if Name did not apply to anything ?
24552455
IFaceGenContexts.remove(Name);
2456+
return;
24562457
}
2458+
--Stats->numOpenDocs;
24572459

2458-
if (Removed) {
2459-
// Cancel any in-flight builds for the given AST.
2460+
// Cancel any in-flight builds for the given AST if needed.
2461+
if (CancelBuilds)
24602462
Removed->cancelBuildsForCachedAST();
24612463

2462-
// Then remove the cached AST if we've been asked to do so.
2463-
if (RemoveCache)
2464-
Removed->removeCachedAST();
2465-
}
2466-
// FIXME: Report error if Name did not apply to anything ?
2464+
// Then remove the cached AST if we've been asked to do so.
2465+
if (RemoveCache)
2466+
Removed->removeCachedAST();
24672467
}
24682468

2469-
24702469
//===----------------------------------------------------------------------===//
24712470
// EditorReplaceText
24722471
//===----------------------------------------------------------------------===//

tools/SourceKit/lib/SwiftLang/SwiftLangSupport.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,8 @@ class SwiftLangSupport : public LangSupport {
615615
SourceKitCancellationToken CancellationToken,
616616
std::shared_ptr<EditorConsumer> Consumer) override;
617617

618-
void editorClose(StringRef Name, bool RemoveCache) override;
618+
void editorClose(StringRef Name, bool CancelBuilds,
619+
bool RemoveCache) override;
619620

620621
void editorReplaceText(StringRef Name, llvm::MemoryBuffer *Buf,
621622
unsigned Offset, unsigned Length,

tools/SourceKit/tools/sourcekitd/lib/Service/Requests.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,8 @@ static sourcekitd_response_t editorExtractTextFromComment(StringRef Source);
288288
289289
static sourcekitd_response_t editorConvertMarkupToXML(StringRef Source);
290290
291-
static sourcekitd_response_t
292-
editorClose(StringRef Name, bool RemoveCache);
291+
static sourcekitd_response_t editorClose(StringRef Name, bool CancelBuilds,
292+
bool RemoveCache);
293293
294294
static sourcekitd_response_t
295295
editorReplaceText(StringRef Name, llvm::MemoryBuffer *Buf, unsigned Offset,
@@ -831,10 +831,14 @@ handleRequestEditorClose(const RequestDict &Req,
831831
if (!Name.has_value())
832832
return Rec(createErrorRequestInvalid("missing 'key.name'"));
833833
834+
// Whether to cancel in-flight builds, default true.
835+
int64_t CancelBuilds = true;
836+
Req.getInt64(KeyCancelBuilds, CancelBuilds, /*isOptional=*/true);
837+
834838
// Whether we remove the cached AST from libcache, by default, false.
835839
int64_t RemoveCache = false;
836840
Req.getInt64(KeyRemoveCache, RemoveCache, /*isOptional=*/true);
837-
return Rec(editorClose(*Name, RemoveCache));
841+
return Rec(editorClose(*Name, CancelBuilds, RemoveCache));
838842
}
839843
}
840844
@@ -3656,11 +3660,11 @@ editorOpenHeaderInterface(StringRef Name, StringRef HeaderName,
36563660
return EditC.createResponse();
36573661
}
36583662

3659-
static sourcekitd_response_t
3660-
editorClose(StringRef Name, bool RemoveCache) {
3663+
static sourcekitd_response_t editorClose(StringRef Name, bool CancelBuilds,
3664+
bool RemoveCache) {
36613665
ResponseBuilder RespBuilder;
36623666
LangSupport &Lang = getGlobalContext().getSwiftLangSupport();
3663-
Lang.editorClose(Name, RemoveCache);
3667+
Lang.editorClose(Name, CancelBuilds, RemoveCache);
36643668
return RespBuilder.createResponse();
36653669
}
36663670

unittests/SourceKit/SwiftLang/CloseTest.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ class CloseTest : public ::testing::Test {
105105
getLang().editorOpen(DocName, Buf.get(), Consumer, Args, std::nullopt);
106106
}
107107

108-
void close(const char *DocName, bool removeCache) {
109-
getLang().editorClose(DocName, removeCache);
108+
void close(const char *DocName, bool CancelBuilds, bool RemoveCache) {
109+
getLang().editorClose(DocName, CancelBuilds, RemoveCache);
110110
}
111111

112112
void getDiagnosticsAsync(
@@ -171,7 +171,7 @@ TEST_F(CloseTest, Cancel) {
171171

172172
getCompileTracker().waitForBuildToStart();
173173

174-
close(DocName, RemoveCache);
174+
close(DocName, /*CancelBuilds*/ true, RemoveCache);
175175

176176
bool Expired = BuildResultSema.wait(30 * 1000);
177177
if (Expired)

unittests/SourceKit/SwiftLang/EditingTest.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ class EditTest : public ::testing::Test {
166166
}
167167

168168
void close(const char *DocName) {
169-
getLang().editorClose(DocName, /*removeCache=*/false);
169+
getLang().editorClose(DocName, /*CancelBuilds*/ true,
170+
/*RemoveCache*/ false);
170171
}
171172

172173
void replaceText(StringRef DocName, unsigned Offset, unsigned Length,

utils/gyb_sourcekit_support/UIDs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ def __init__(self, internal_name, external_name):
116116
KEY('Introduced', 'key.introduced'),
117117
KEY('Deprecated', 'key.deprecated'),
118118
KEY('Obsoleted', 'key.obsoleted'),
119+
KEY('CancelBuilds', 'key.cancel_builds'),
119120
KEY('RemoveCache', 'key.removecache'),
120121
KEY('TypeUsr', 'key.typeusr'),
121122
KEY('ContainerTypeUsr', 'key.containertypeusr'),

0 commit comments

Comments
 (0)