Skip to content

Commit ffbf025

Browse files
committed
Open and edit documents in syntactic-only mode in sourcekitd
With this change, opening and editing a document no longer causes a non-cancellable AST build. Instead, all semantic information is retrieved via requests that can be cancelled (after we implement cancellation).
1 parent 080e664 commit ffbf025

File tree

3 files changed

+12
-17
lines changed

3 files changed

+12
-17
lines changed

Sources/SourceKitD/sourcekitd_uids.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public struct sourcekitd_keys {
5959
public let request: sourcekitd_uid_t
6060
public let results: sourcekitd_uid_t
6161
public let retrieve_refactor_actions: sourcekitd_uid_t
62+
public let semantic_tokens: sourcekitd_uid_t
6263
public let severity: sourcekitd_uid_t
6364
public let sourcefile: sourcekitd_uid_t
6465
public let sourcetext: sourcekitd_uid_t
@@ -135,6 +136,7 @@ public struct sourcekitd_keys {
135136
request = api.uid_get_from_cstr("key.request")!
136137
results = api.uid_get_from_cstr("key.results")!
137138
retrieve_refactor_actions = api.uid_get_from_cstr("key.retrieve_refactor_actions")!
139+
semantic_tokens = api.uid_get_from_cstr("key.semantic_tokens")!
138140
severity = api.uid_get_from_cstr("key.severity")!
139141
sourcefile = api.uid_get_from_cstr("key.sourcefile")!
140142
sourcetext = api.uid_get_from_cstr("key.sourcetext")!

Sources/SourceKitLSP/Swift/SemanticTokens.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,14 @@ extension SwiftLanguageServer {
3232
skreq[keys.compilerargs] = buildSettings.compilerArgs
3333

3434
let dict = try await sourcekitd.send(skreq)
35-
print(dict.description)
36-
return semanticTokens(of: dict, for: snapshot)
35+
36+
guard let skTokens: SKDResponseArray = dict[keys.semantic_tokens] else {
37+
return nil
38+
}
39+
let tokenParser = SyntaxHighlightingTokenParser(sourcekitd: sourcekitd)
40+
var tokens: [SyntaxHighlightingToken] = []
41+
tokenParser.parseTokens(skTokens, in: snapshot, into: &tokens)
42+
return tokens
3743
}
3844

3945
/// Computes an array of syntax highlighting tokens from the syntax tree that

Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -192,21 +192,6 @@ public actor SwiftLanguageServer: ToolchainLanguageServer {
192192
) {
193193
self.stateChangeHandlers.append(handler)
194194
}
195-
196-
/// Returns the semantic tokens in `response` for the given `snapshot`.
197-
func semanticTokens(
198-
of response: SKDResponseDictionary,
199-
for snapshot: DocumentSnapshot
200-
) -> [SyntaxHighlightingToken]? {
201-
guard let skTokens: SKDResponseArray = response[keys.annotations] else {
202-
return nil
203-
}
204-
let tokenParser = SyntaxHighlightingTokenParser(sourcekitd: sourcekitd)
205-
var tokens: [SyntaxHighlightingToken] = []
206-
tokenParser.parseTokens(skTokens, in: snapshot, into: &tokens)
207-
208-
return tokens
209-
}
210195
}
211196

212197
extension SwiftLanguageServer {
@@ -343,6 +328,7 @@ extension SwiftLanguageServer {
343328
req[keys.request] = self.requests.editor_open
344329
req[keys.name] = note.textDocument.uri.pseudoPath
345330
req[keys.sourcetext] = snapshot.text
331+
req[keys.syntactic_only] = 1
346332

347333
let compileCommand = await self.buildSettings(for: snapshot.uri)
348334

@@ -430,6 +416,7 @@ extension SwiftLanguageServer {
430416
let req = SKDRequestDictionary(sourcekitd: self.sourcekitd)
431417
req[keys.request] = self.requests.editor_replacetext
432418
req[keys.name] = note.textDocument.uri.pseudoPath
419+
req[keys.syntactic_only] = 1
433420

434421
if let range = edit.range {
435422
guard let offset = before.utf8OffsetOf(line: range.lowerBound.line, utf16Column: range.lowerBound.utf16index),

0 commit comments

Comments
 (0)