Skip to content

Commit f3dfa71

Browse files
committed
Log execution times for token parsing
Add logExecutionTime
1 parent bf3169f commit f3dfa71

File tree

2 files changed

+49
-28
lines changed

2 files changed

+49
-28
lines changed

Sources/LSPLogging/Logging.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,23 @@ public func orLog<R>(
6262
}
6363
}
6464

65+
/// Logs the time that the given block takes to execute in milliseconds.
66+
public func logExecutionTime<R>(
67+
_ prefix: String = #function,
68+
level: LogLevel = .default,
69+
logger: Logger = Logger.shared,
70+
_ block: () throws -> R
71+
) rethrows -> R {
72+
let start = Date()
73+
let result = try block()
74+
let deltaMs = -start.timeIntervalSinceNow * 1000
75+
logger.log(
76+
"\(prefix)\(prefix.isEmpty ? "" : " ")took \(String(format: "%.2f", deltaMs)) ms to execute",
77+
level: level
78+
)
79+
return result
80+
}
81+
6582
public protocol LogHandler: AnyObject {
6683
func handle(_ message: String, level: LogLevel)
6784
}

Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -184,34 +184,36 @@ public final class SwiftLanguageServer: ToolchainLanguageServer {
184184
response: SKDResponseDictionary,
185185
for snapshot: DocumentSnapshot
186186
) -> DocumentTokens {
187-
var docTokens = snapshot.tokens
187+
logExecutionTime(level: .debug) {
188+
var docTokens = snapshot.tokens
189+
190+
guard let offset: Int = response[keys.offset],
191+
let length: Int = response[keys.length],
192+
let start: Position = snapshot.positionOf(utf8Offset: offset),
193+
let end: Position = snapshot.positionOf(utf8Offset: offset + length) else {
194+
// This e.g. happens in the case of empty edits
195+
log("did not update lexical/syntactic tokens, no range found", level: .debug)
196+
return docTokens
197+
}
188198

189-
guard let offset: Int = response[keys.offset],
190-
let length: Int = response[keys.length],
191-
let start: Position = snapshot.positionOf(utf8Offset: offset),
192-
let end: Position = snapshot.positionOf(utf8Offset: offset + length) else {
193-
// This e.g. happens in the case of empty edits
194-
log("did not update lexical/syntactic tokens, no range found", level: .debug)
195-
return docTokens
196-
}
199+
let range = start..<end
197200

198-
let range = start..<end
201+
if let syntaxMap: SKDResponseArray = response[keys.syntaxmap] {
202+
let tokenParser = SyntaxHighlightingTokenParser(sourcekitd: sourcekitd)
203+
let tokens = tokenParser.parseTokens(syntaxMap, in: snapshot)
199204

200-
if let syntaxMap: SKDResponseArray = response[keys.syntaxmap] {
201-
let tokenParser = SyntaxHighlightingTokenParser(sourcekitd: sourcekitd)
202-
let tokens = tokenParser.parseTokens(syntaxMap, in: snapshot)
205+
docTokens.replaceLexical(in: range, with: tokens)
206+
}
203207

204-
docTokens.replaceLexical(in: range, with: tokens)
205-
}
208+
if let substructure: SKDResponseArray = response[keys.substructure] {
209+
let tokenParser = SyntaxHighlightingTokenParser(sourcekitd: sourcekitd, useName: true)
210+
let tokens = tokenParser.parseTokens(substructure, in: snapshot)
206211

207-
if let substructure: SKDResponseArray = response[keys.substructure] {
208-
let tokenParser = SyntaxHighlightingTokenParser(sourcekitd: sourcekitd, useName: true)
209-
let tokens = tokenParser.parseTokens(substructure, in: snapshot)
212+
docTokens.syntactic = tokens
213+
}
210214

211-
docTokens.syntactic = tokens
215+
return docTokens
212216
}
213-
214-
return docTokens
215217
}
216218

217219
/// Updates the semantic tokens for the given `snapshot`.
@@ -237,16 +239,18 @@ public final class SwiftLanguageServer: ToolchainLanguageServer {
237239
response: SKDResponseDictionary,
238240
for snapshot: DocumentSnapshot
239241
) -> DocumentTokens {
240-
var docTokens = snapshot.tokens
242+
logExecutionTime(level: .debug) {
243+
var docTokens = snapshot.tokens
241244

242-
if let skTokens: SKDResponseArray = response[keys.annotations] {
243-
let tokenParser = SyntaxHighlightingTokenParser(sourcekitd: sourcekitd)
244-
let tokens = tokenParser.parseTokens(skTokens, in: snapshot)
245+
if let skTokens: SKDResponseArray = response[keys.annotations] {
246+
let tokenParser = SyntaxHighlightingTokenParser(sourcekitd: sourcekitd)
247+
let tokens = tokenParser.parseTokens(skTokens, in: snapshot)
245248

246-
docTokens.semantic = tokens
247-
}
249+
docTokens.semantic = tokens
250+
}
248251

249-
return docTokens
252+
return docTokens
253+
}
250254
}
251255

252256
/// Inform the client about changes to the syntax highlighting tokens.

0 commit comments

Comments
 (0)