Skip to content

Commit 4ad1c83

Browse files
authored
Merge pull request #934 from ahoppen/ahoppen/no-sendsync
Remove `SourceKitD.sendSync`
2 parents 182deb7 + 5bdd6f2 commit 4ad1c83

File tree

4 files changed

+55
-50
lines changed

4 files changed

+55
-50
lines changed

Sources/SourceKitD/SourceKitD.swift

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,6 @@ extension SourceKitD {
6565

6666
// MARK: - Convenience API for requests.
6767

68-
/// Send the given request and synchronously receive a reply dictionary (or error).
69-
public func sendSync(_ req: SKDRequestDictionary) throws -> SKDResponseDictionary {
70-
logRequest(req)
71-
72-
let resp = SKDResponse(api.send_request_sync(req.dict), sourcekitd: self)
73-
74-
logResponse(resp)
75-
76-
guard let dict = resp.value else {
77-
throw resp.error!
78-
}
79-
80-
return dict
81-
}
82-
8368
public func send(_ req: SKDRequestDictionary) async throws -> SKDResponseDictionary {
8469
logRequest(req)
8570

Sources/SourceKitLSP/Swift/CodeCompletionSession.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class CodeCompletionSession {
120120
}
121121
// The sessions aren't compatible. Close the existing session and open
122122
// a new one below.
123-
session.close()
123+
await session.close()
124124
}
125125
if mustReuse {
126126
logger.error("triggerFromIncompleteCompletions with no existing completion session")
@@ -264,7 +264,7 @@ class CodeCompletionSession {
264264
return dict
265265
}
266266

267-
private func close() {
267+
private func close() async {
268268
switch self.state {
269269
case .closed:
270270
// Already closed, nothing to do.
@@ -275,7 +275,7 @@ class CodeCompletionSession {
275275
req[keys.offset] = self.utf8StartOffset
276276
req[keys.name] = self.snapshot.uri.pseudoPath
277277
logger.info("Closing code completion session: \(self, privacy: .private)")
278-
_ = try? sourcekitd.sendSync(req)
278+
_ = try? await sourcekitd.send(req)
279279
self.state = .closed
280280
}
281281
}

Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,10 @@ extension SwiftLanguageServer {
259259
}
260260

261261
/// Tell sourcekitd to crash itself. For testing purposes only.
262-
public func _crash() {
262+
public func _crash() async {
263263
let req = SKDRequestDictionary(sourcekitd: sourcekitd)
264264
req[sourcekitd.keys.request] = sourcekitd.requests.crash_exit
265-
_ = try? sourcekitd.sendSync(req)
265+
_ = try? await sourcekitd.send(req)
266266
}
267267

268268
// MARK: - Build System Integration
@@ -276,7 +276,7 @@ extension SwiftLanguageServer {
276276
let closeReq = SKDRequestDictionary(sourcekitd: self.sourcekitd)
277277
closeReq[keys.request] = self.requests.editor_close
278278
closeReq[keys.name] = path
279-
_ = try? self.sourcekitd.sendSync(closeReq)
279+
_ = try? await self.sourcekitd.send(closeReq)
280280

281281
let openReq = SKDRequestDictionary(sourcekitd: self.sourcekitd)
282282
openReq[keys.request] = self.requests.editor_open
@@ -286,7 +286,7 @@ extension SwiftLanguageServer {
286286
openReq[keys.compilerargs] = compileCmd.compilerArgs
287287
}
288288

289-
_ = try? self.sourcekitd.sendSync(openReq)
289+
_ = try? await self.sourcekitd.send(openReq)
290290

291291
publishDiagnosticsIfNeeded(for: snapshot.uri)
292292
}
@@ -336,7 +336,7 @@ extension SwiftLanguageServer {
336336
req[keys.compilerargs] = compilerArgs
337337
}
338338

339-
_ = try? self.sourcekitd.sendSync(req)
339+
_ = try? await self.sourcekitd.send(req)
340340
publishDiagnosticsIfNeeded(for: note.textDocument.uri)
341341
}
342342

@@ -354,7 +354,7 @@ extension SwiftLanguageServer {
354354
req[keys.request] = self.requests.editor_close
355355
req[keys.name] = uri.pseudoPath
356356

357-
_ = try? self.sourcekitd.sendSync(req)
357+
_ = try? await self.sourcekitd.send(req)
358358
}
359359

360360
/// Cancels any in-flight tasks to send a `PublishedDiagnosticsNotification` after edits.
@@ -422,46 +422,66 @@ extension SwiftLanguageServer {
422422
cancelInFlightPublishDiagnosticsTask(for: note.textDocument.uri)
423423

424424
let keys = self.keys
425-
var edits: [IncrementalEdit] = []
425+
struct Edit {
426+
let offset: Int
427+
let length: Int
428+
let replacement: String
429+
}
430+
431+
var edits: [Edit] = []
426432

427433
let editResult = self.documentManager.edit(note) {
428434
(before: LineTable, edit: TextDocumentContentChangeEvent) in
429-
let req = SKDRequestDictionary(sourcekitd: self.sourcekitd)
430-
req[keys.request] = self.requests.editor_replacetext
431-
req[keys.name] = note.textDocument.uri.pseudoPath
432-
req[keys.syntactic_only] = 1
433-
434435
if let range = edit.range {
435436
guard let offset = before.utf8OffsetOf(line: range.lowerBound.line, utf16Column: range.lowerBound.utf16index),
436437
let end = before.utf8OffsetOf(line: range.upperBound.line, utf16Column: range.upperBound.utf16index)
437438
else {
438439
fatalError("invalid edit \(range)")
439440
}
440-
441-
let length = end - offset
442-
req[keys.offset] = offset
443-
req[keys.length] = length
444-
445-
edits.append(IncrementalEdit(offset: offset, length: length, replacementLength: edit.text.utf8.count))
441+
edits.append(
442+
Edit(
443+
offset: offset,
444+
length: end - offset,
445+
replacement: edit.text
446+
)
447+
)
446448
} else {
447-
// Full text
448-
let length = before.content.utf8.count
449-
req[keys.offset] = 0
450-
req[keys.length] = length
451-
452-
edits.append(IncrementalEdit(offset: 0, length: length, replacementLength: edit.text.utf8.count))
449+
edits.append(
450+
Edit(
451+
offset: 0,
452+
length: before.content.utf8.count,
453+
replacement: edit.text
454+
)
455+
)
453456
}
454-
455-
req[keys.sourcetext] = edit.text
456-
_ = try? self.sourcekitd.sendSync(req)
457457
}
458+
for edit in edits {
459+
let req = SKDRequestDictionary(sourcekitd: self.sourcekitd)
460+
req[keys.request] = self.requests.editor_replacetext
461+
req[keys.name] = note.textDocument.uri.pseudoPath
462+
req[keys.syntactic_only] = 1
463+
req[keys.offset] = edit.offset
464+
req[keys.length] = edit.length
465+
req[keys.sourcetext] = edit.replacement
466+
do {
467+
_ = try await self.sourcekitd.send(req)
468+
} catch {
469+
fatalError("failed to apply edit")
470+
}
471+
}
472+
458473
guard let (preEditSnapshot, postEditSnapshot) = editResult else {
459474
return
460475
}
476+
let concurrentEdits = ConcurrentEdits(
477+
fromSequential: edits.map {
478+
IncrementalEdit(offset: $0.offset, length: $0.length, replacementLength: $0.replacement.utf8.count)
479+
}
480+
)
461481
await syntaxTreeManager.registerEdit(
462482
preEditSnapshot: preEditSnapshot,
463483
postEditSnapshot: postEditSnapshot,
464-
edits: ConcurrentEdits(fromSequential: edits)
484+
edits: concurrentEdits
465485
)
466486

467487
publishDiagnosticsIfNeeded(for: note.textDocument.uri)

Tests/SourceKitDTests/SourceKitDTests.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ final class SourceKitDTests: XCTestCase {
3636
.trimmingCharacters(in: .whitespacesAndNewlines)
3737
}
3838

39-
func testMultipleNotificationHandlers() throws {
39+
func testMultipleNotificationHandlers() async throws {
4040
let sourcekitd = try SourceKitDImpl.getOrCreate(dylibPath: SourceKitDTests.sourcekitdPath)
4141
let keys = sourcekitd.keys
4242
let path = DocumentURI.for(.swift).pseudoPath
@@ -88,14 +88,14 @@ final class SourceKitDTests: XCTestCase {
8888
args.append(path)
8989
req[keys.compilerargs] = args
9090

91-
_ = try sourcekitd.sendSync(req)
91+
_ = try await sourcekitd.send(req)
9292

93-
waitForExpectations(timeout: defaultTimeout)
93+
try await fulfillmentOfOrThrow([expectation1, expectation2])
9494

9595
let close = SKDRequestDictionary(sourcekitd: sourcekitd)
9696
close[keys.request] = sourcekitd.requests.editor_close
9797
close[keys.name] = path
98-
_ = try sourcekitd.sendSync(close)
98+
_ = try await sourcekitd.send(close)
9999
}
100100
}
101101

0 commit comments

Comments
 (0)