@@ -35,6 +35,14 @@ import DocCDocumentation
35
35
/// Disambiguate LanguageServerProtocol.Language and IndexstoreDB.Language
36
36
package typealias Language = LanguageServerProtocol . Language
37
37
38
+ struct LanguageServiceIdentifier : Hashable {
39
+ private let identifier : String
40
+
41
+ init ( type: LanguageService . Type ) {
42
+ self . identifier = String ( reflecting: type)
43
+ }
44
+ }
45
+
38
46
/// The SourceKit-LSP server.
39
47
///
40
48
/// This is the client-facing language server implementation, providing indexing, multiple-toolchain
@@ -75,7 +83,9 @@ package actor SourceKitLSPServer {
75
83
76
84
package var capabilityRegistry : CapabilityRegistry ?
77
85
78
- var languageServices : [ LanguageServerType : [ LanguageService ] ] = [ : ]
86
+ private let languageServiceRegistry : LanguageServiceRegistry
87
+
88
+ var languageServices : [ LanguageServiceIdentifier : [ LanguageService ] ] = [ : ]
79
89
80
90
package let documentManager = DocumentManager ( )
81
91
@@ -160,11 +170,13 @@ package actor SourceKitLSPServer {
160
170
package init (
161
171
client: Connection ,
162
172
toolchainRegistry: ToolchainRegistry ,
173
+ languageServerRegistry: LanguageServiceRegistry ,
163
174
options: SourceKitLSPOptions ,
164
175
hooks: Hooks ,
165
176
onExit: @escaping ( ) -> Void = { }
166
177
) {
167
178
self . toolchainRegistry = toolchainRegistry
179
+ self . languageServiceRegistry = languageServerRegistry
168
180
self . _options = ThreadSafeBox ( initialValue: options)
169
181
self . hooks = hooks
170
182
self . onExit = onExit
@@ -450,11 +462,11 @@ package actor SourceKitLSPServer {
450
462
/// If a language service of type `serverType` that can handle `workspace` using the given toolchain has already been
451
463
/// started, return it, otherwise return `nil`.
452
464
private func existingLanguageService(
453
- _ serverType: LanguageServerType ,
465
+ _ serverType: LanguageService . Type ,
454
466
toolchain: Toolchain ,
455
467
workspace: Workspace
456
468
) -> LanguageService ? {
457
- for languageService in languageServices [ serverType, default: [ ] ] {
469
+ for languageService in languageServices [ LanguageServiceIdentifier ( type : serverType) , default: [ ] ] {
458
470
if languageService. canHandle ( workspace: workspace, toolchain: toolchain) {
459
471
return languageService
460
472
}
@@ -467,7 +479,7 @@ package actor SourceKitLSPServer {
467
479
_ language: Language ,
468
480
in workspace: Workspace
469
481
) async -> LanguageService ? {
470
- guard let serverType = LanguageServerType ( language : language) else {
482
+ guard let serverType = languageServiceRegistry . languageService ( for : language) else {
471
483
logger. error ( " Unable to infer language server type for language ' \( language) ' " )
472
484
return nil
473
485
}
@@ -478,7 +490,7 @@ package actor SourceKitLSPServer {
478
490
479
491
// Start a new service.
480
492
return await orLog ( " failed to start language service " , level: . error) { [ options = workspace. options, hooks] in
481
- let service = try await serverType. serverType . init (
493
+ let service = try await serverType. init (
482
494
sourceKitLSPServer: self ,
483
495
toolchain: toolchain,
484
496
options: options,
@@ -538,7 +550,7 @@ package actor SourceKitLSPServer {
538
550
return concurrentlyInitializedService
539
551
}
540
552
541
- languageServices [ serverType, default: [ ] ] . append ( service)
553
+ languageServices [ LanguageServiceIdentifier ( type : serverType) , default: [ ] ] . append ( service)
542
554
return service
543
555
}
544
556
}
0 commit comments