in Sources/SourceKitLSP/SourceKitServer.swift [283:325]
func languageService(
for toolchain: Toolchain,
_ language: Language,
in workspace: Workspace
) -> ToolchainLanguageServer? {
let key = LanguageServiceKey(toolchain: toolchain.identifier, language: language)
if let service = languageService[key] {
return service
}
// Start a new service.
return orLog("failed to start language service", level: .error) {
guard let service = try SourceKitLSP.languageService(
for: toolchain, language, options: options, client: self, in: workspace, reopenDocuments: { [weak self] in self?.reopenDocuments(for: $0) })
else {
return nil
}
let pid = Int(ProcessInfo.processInfo.processIdentifier)
let resp = try service.initializeSync(InitializeRequest(
processId: pid,
rootPath: nil,
rootURI: workspace.rootUri,
initializationOptions: nil,
capabilities: workspace.capabilityRegistry.clientCapabilities,
trace: .off,
workspaceFolders: nil))
let languages = languageClass(for: language)
self.registerCapabilities(
for: resp.capabilities, languages: languages, registry: workspace.capabilityRegistry)
// FIXME: store the server capabilities.
let syncKind = resp.capabilities.textDocumentSync?.change ?? .incremental
guard syncKind == .incremental else {
fatalError("non-incremental update not implemented")
}
service.clientInitialized(InitializedNotification())
languageService[key] = service
return service
}
}