Skip to content

Commit 71fbc57

Browse files
Make sure to invoke capability handlers
1 parent 9ed2444 commit 71fbc57

File tree

5 files changed

+49
-22
lines changed

5 files changed

+49
-22
lines changed

Package.resolved

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ let package = Package(
1717
targets: ["LanguageClient"]),
1818
],
1919
dependencies: [
20-
.package(url: "https://github.com/ChimeHQ/LanguageServerProtocol", from: "0.13.2"),
20+
.package(url: "https://github.com/ChimeHQ/LanguageServerProtocol", from: "0.13.3"),
2121
.package(url: "https://github.com/Frizlab/FSEventsWrapper", from: "2.1.0"),
2222
.package(url: "https://github.com/davbeck/swift-glob", from: "0.0.0"),
2323
.package(url: "https://github.com/ChimeHQ/JSONRPC", from: "0.9.0"),

Sources/LanguageClient/DataChannel+LocalProcess.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ extension DataChannel {
4242
let dataStream = stdoutPipe.fileHandleForReading.dataStream
4343

4444
for try await data in dataStream {
45+
print("read:", String(decoding: data, as: UTF8.self))
4546
continuation.yield(data)
4647
}
4748

@@ -61,6 +62,8 @@ extension DataChannel {
6162
// to prevent it from being deallocated
6263
_ = process
6364

65+
print("write:", String(decoding: $0, as: UTF8.self))
66+
6467
try stdinPipe.fileHandleForWriting.write(contentsOf: $0)
6568
}
6669

Sources/LanguageClient/InitializingServer.swift

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,22 @@ import Foundation
33
import os.log
44
#endif
55

6-
import Semaphore
6+
import JSONRPC
77
import LanguageServerProtocol
8+
import Semaphore
89

910
enum InitializingServerError: Error {
1011
case noStateProvider
1112
case capabilitiesUnavailable
1213
case stateInvalid
1314
}
1415

16+
extension AnyJSONRPCResponseError {
17+
init(error: any Error) {
18+
self.init(code: JSONRPCErrors.internalError, message: error.localizedDescription)
19+
}
20+
}
21+
1522
/// Server implementation that lazily initializes another Server on first message.
1623
///
1724
/// Provides special handling for `shutdown` and `exit` messages.
@@ -205,33 +212,47 @@ extension InitializingServer {
205212
return initResponse
206213
}
207214

208-
private func handleEvent(_ event: ServerEvent) {
215+
private func handleEvent(_ event: ServerEvent) async {
209216
switch event {
210217
case let .request(_, request):
211-
handleRequest(request)
218+
await handleRequest(request)
212219
default:
213220
break
214221
}
215222
}
216223

217-
private func handleRequest(_ request: ServerRequest) {
224+
private func handleRequest(_ request: ServerRequest) async {
218225
guard case .initialized(let initResp) = self.state else {
219226
fatalError("received a request without being initialized")
220227
}
221228

222229
var newCaps = initResp.capabilities
223230

224-
do {
225-
switch request {
226-
case .clientRegisterCapability(let params, _):
231+
switch request {
232+
case let .clientRegisterCapability(params, handler):
233+
do {
227234
try newCaps.applyRegistrations(params.registrations)
228-
case .clientUnregisterCapability(let params, _):
235+
236+
await handler(nil)
237+
} catch {
238+
print("failed to process clientRegisterCapability: \(error)")
239+
240+
await handler(AnyJSONRPCResponseError(error: error))
241+
}
242+
case let .clientUnregisterCapability(params, handler):
243+
do {
229244
try newCaps.applyUnregistrations(params.unregistrations)
230-
default:
231-
break
245+
246+
await handler(nil)
247+
} catch {
248+
print("failed to process clientUnregisterCapability: \(error)")
249+
250+
await handler(AnyJSONRPCResponseError(error: error))
232251
}
233-
} catch {
234-
print("unable to mutate server capabilities: \(error)")
252+
default:
253+
print("unhandled request: \(request)")
254+
255+
await request.relyWithError(InitializingServerError.stateInvalid)
235256
}
236257

237258
if initResp.capabilities != newCaps {

Tests/LanguageClientTests/ServerTests.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,14 @@ final class ServerTests: XCTestCase {
7878
Registration(id: "abc", method: ClientRequest.Method.textDocumentSemanticTokens.rawValue, registerOptions: options)
7979
])
8080

81-
await mockChannel.sendMockRequest(.clientRegisterCapability(params, { _ in }))
81+
let registerExp = expectation(description: "registration handled")
82+
await mockChannel.sendMockRequest(.clientRegisterCapability(params, { _ in registerExp.fulfill() }))
8283

8384
let caps2 = await iterator.next()
8485

8586
XCTAssertNotNil(caps2?.semanticTokensProvider)
87+
88+
await fulfillment(of: [registerExp], timeout: 1.0)
8689
}
8790
}
8891
#endif

0 commit comments

Comments
 (0)