Skip to content

Commit bc5797c

Browse files
committed
Provide both lexical and syntactical tokens
This includes e.g. declarations.
1 parent 7014ada commit bc5797c

File tree

2 files changed

+34
-21
lines changed

2 files changed

+34
-21
lines changed

Sources/SourceKitLSP/Swift/SemanticTokens.swift

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -216,38 +216,37 @@ public func mergeSemanticTokens(_ lhs: [SemanticToken], _ rhs: [SemanticToken])
216216
struct SemanticTokenParser {
217217
private let sourcekitd: SourceKitD
218218
private let snapshot: DocumentSnapshot
219+
private let useName: Bool
219220

220-
init(sourcekitd: SourceKitD, snapshot: DocumentSnapshot) {
221+
init(sourcekitd: SourceKitD, snapshot: DocumentSnapshot, useName: Bool = false) {
221222
self.sourcekitd = sourcekitd
222223
self.snapshot = snapshot
224+
self.useName = useName
223225
}
224226

225227
func parseTokens(_ response: SKDResponseDictionary) -> [SemanticToken] {
226228
let keys = sourcekitd.keys
229+
var tokens: [SemanticToken] = []
227230

228-
guard let offset: Int = response[keys.offset],
231+
if let offset: Int = useName ? response[keys.nameoffset] : response[keys.offset],
232+
let length: Int = useName ? response[keys.namelength] : response[keys.length],
229233
let start: Position = snapshot.positionOf(utf8Offset: offset),
230-
let length: Int = response[keys.length],
231234
let skKind: sourcekitd_uid_t = response[keys.kind],
232-
let (kind, modifiers) = parseKindAndModifiers(skKind) else {
233-
return []
235+
let (kind, modifiers) = parseKindAndModifiers(skKind) {
236+
let token = SemanticToken(
237+
start: start,
238+
length: length,
239+
kind: kind,
240+
modifiers: modifiers
241+
)
242+
tokens.append(token)
234243
}
235244

236-
let token = SemanticToken(
237-
start: start,
238-
length: length,
239-
kind: kind,
240-
modifiers: modifiers
241-
)
242-
243-
let children: [SemanticToken]
244245
if let substructure: SKDResponseArray = response[keys.substructure] {
245-
children = parseTokens(substructure)
246-
} else {
247-
children = []
246+
tokens += parseTokens(substructure)
248247
}
249248

250-
return [token] + children
249+
return tokens
251250
}
252251

253252
func parseTokens(_ response: SKDResponseArray) -> [SemanticToken] {

Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,19 +167,33 @@ public final class SwiftLanguageServer: ToolchainLanguageServer {
167167
for snapshot: DocumentSnapshot
168168
) {
169169
let uri = snapshot.document.uri
170-
let tokenParser = SemanticTokenParser(
171-
sourcekitd: sourcekitd,
172-
snapshot: snapshot
173-
)
174170

175171
if let syntaxMap: SKDResponseArray = response[keys.syntaxmap] {
172+
let tokenParser = SemanticTokenParser(
173+
sourcekitd: sourcekitd,
174+
snapshot: snapshot
175+
)
176176
let tokens = tokenParser.parseTokens(syntaxMap)
177177
do {
178178
try documentManager.addLexicalTokens(uri, tokens: tokens)
179179
} catch {
180180
log("updating lexical tokens for \(uri) failed: \(error)", level: .warning)
181181
}
182182
}
183+
184+
if let substructure: SKDResponseArray = response[keys.substructure] {
185+
let tokenParser = SemanticTokenParser(
186+
sourcekitd: sourcekitd,
187+
snapshot: snapshot,
188+
useName: true
189+
)
190+
let tokens = tokenParser.parseTokens(substructure)
191+
do {
192+
try documentManager.replaceSyntacticTokens(uri, tokens: tokens)
193+
} catch {
194+
log("updating lexical tokens for \(uri) failed: \(error)", level: .warning)
195+
}
196+
}
183197
}
184198

185199
/// Update semantic tokens for the given `snapshot`.

0 commit comments

Comments
 (0)