Skip to content

Commit ab47ef9

Browse files
committed
Stop launching language service for a language if one fails
If a language service fails to start, don't try starting language services with lower precedence. Otherwise we get into a situation where eg. `SwiftLanguageService`` fails to start (eg. because the toolchain doesn't contain sourcekitd) and the `DocumentationLanguageService` now becomes the primary language service for the document, trying to serve documentation, completion etc. which is not intended.
1 parent 0e75e95 commit ab47ef9

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

Sources/SourceKitLSP/SourceKitLSPServer.swift

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -474,15 +474,16 @@ package actor SourceKitLSPServer {
474474
_ language: Language,
475475
in workspace: Workspace
476476
) async -> [LanguageService] {
477-
let result = await languageServiceRegistry.languageServices(for: language).asyncCompactMap {
478-
(serverType) -> LanguageService? in
479-
// Pick the first language service that can handle this workspace.
477+
var result: [any LanguageService] = []
478+
for serverType in languageServiceRegistry.languageServices(for: language) {
480479
if let languageService = existingLanguageService(serverType, toolchain: toolchain, workspace: workspace) {
481-
return languageService
480+
result.append(languageService)
481+
continue
482482
}
483483

484484
// Start a new service.
485-
return await orLog("failed to start language service", level: .error) { [options = workspace.options, hooks] in
485+
let languageService: (any LanguageService)? = await orLog("failed to start language service") {
486+
[options = workspace.options, hooks] in
486487
let service = try await serverType.init(
487488
sourceKitLSPServer: self,
488489
toolchain: toolchain,
@@ -546,6 +547,14 @@ package actor SourceKitLSPServer {
546547
languageServices[LanguageServiceType(serverType), default: []].append(service)
547548
return service
548549
}
550+
guard let languageService else {
551+
// If a language service fails to start, don't try starting language services with lower precedence. Otherwise
552+
// we get into a situation where eg. `SwiftLanguageService`` fails to start (eg. because the toolchain doesn't
553+
// contain sourcekitd) and the `DocumentationLanguageService` now becomes the primary language service for the
554+
// document, trying to serve documentation, completion etc. which is not intended.
555+
break
556+
}
557+
result.append(languageService)
549558
}
550559
if result.isEmpty {
551560
logger.error("Unable to infer language server type for language '\(language)'")

0 commit comments

Comments
 (0)