Skip to content

Commit d36299f

Browse files
committed
Run language service requests concurrently, instead of sequentially
1 parent 0945fa7 commit d36299f

1 file changed

Lines changed: 32 additions & 12 deletions

File tree

Sources/SourceKitLSP/SourceKitLSPServer.swift

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -408,22 +408,42 @@ package actor SourceKitLSPServer {
408408
throw ResponseError.unknown("No language service for '\(request.textDocument.uri)' found")
409409
}
410410

411-
var responses: [RequestType.Response] = []
412-
for languageService in languageServices {
413-
do {
414-
guard let response = try await requestHandler(request, workspace, languageService) else {
415-
continue
411+
guard let combine else {
412+
// No `combine` supplied: first language service to answer wins, race them.
413+
return try await withThrowingTaskGroup(of: RequestType.Response?.self) { group in
414+
for languageService in languageServices {
415+
group.addTask {
416+
do {
417+
return try await requestHandler(request, workspace, languageService)
418+
} catch let error as ResponseError where error.code == .requestNotImplemented {
419+
return nil
420+
}
421+
}
416422
}
417-
guard let combine else {
418-
// No `combine` supplied: first language service to answer wins,
419-
return response
423+
for try await response in group {
424+
if let response { return response }
420425
}
421-
responses.append(response)
422-
} catch let error as ResponseError where error.code == .requestNotImplemented {
423-
continue
426+
throw ResponseError.unknown("No language service implements \(type(of: request).method)")
427+
}
428+
}
429+
430+
let responses = try await withThrowingTaskGroup(of: RequestType.Response?.self) { group in
431+
for languageService in languageServices {
432+
group.addTask {
433+
do {
434+
return try await requestHandler(request, workspace, languageService)
435+
} catch let error as ResponseError where error.code == .requestNotImplemented {
436+
return nil
437+
}
438+
}
439+
}
440+
var results: [RequestType.Response] = []
441+
for try await response in group {
442+
if let response { results.append(response) }
424443
}
444+
return results
425445
}
426-
guard let combine, !responses.isEmpty else {
446+
guard !responses.isEmpty else {
427447
throw ResponseError.unknown("No language service implements \(type(of: request).method)")
428448
}
429449
return combine(responses)

0 commit comments

Comments
 (0)