@@ -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