in Sources/SourceKitLSP/SourceKitServer.swift [449:513]
func initialize(_ req: Request<InitializeRequest>) {
var indexOptions = self.options.indexOptions
if case .dictionary(let options) = req.params.initializationOptions {
if case .bool(let listenToUnitEvents) = options["listenToUnitEvents"] {
indexOptions.listenToUnitEvents = listenToUnitEvents
}
if case .dictionary(let completionOptions) = options["completion"] {
if case .bool(let serverSideFiltering) = completionOptions["serverSideFiltering"] {
self.options.completionOptions.serverSideFiltering = serverSideFiltering
}
switch completionOptions["maxResults"] {
case .none:
break
case .some(.null):
self.options.completionOptions.maxResults = nil
case .some(.int(let maxResults)):
self.options.completionOptions.maxResults = maxResults
case .some(let invalid):
log("expected null or int for 'maxResults'; got \(invalid)", level: .warning)
}
}
}
let capabilityRegistry = CapabilityRegistry(clientCapabilities: req.params.capabilities)
// Any messages sent before initialize returns are expected to fail, so this will run before
// the first "supported" request. Run asynchronously to hide the latency of setting up the
// build system and index.
queue.async {
if let uri = req.params.rootURI {
self.workspace = try? Workspace(
rootUri: uri,
capabilityRegistry: capabilityRegistry,
toolchainRegistry: self.toolchainRegistry,
buildSetup: self.options.buildSetup,
indexOptions: indexOptions)
} else if let path = req.params.rootPath {
self.workspace = try? Workspace(
rootUri: DocumentURI(URL(fileURLWithPath: path)),
capabilityRegistry: capabilityRegistry,
toolchainRegistry: self.toolchainRegistry,
buildSetup: self.options.buildSetup,
indexOptions: indexOptions)
}
if self.workspace == nil {
log("no workspace found", level: .warning)
self.workspace = Workspace(
rootUri: req.params.rootURI,
capabilityRegistry: capabilityRegistry,
toolchainRegistry: self.toolchainRegistry,
buildSetup: self.options.buildSetup,
underlyingBuildSystem: nil,
index: nil,
indexDelegate: nil)
}
assert(self.workspace != nil)
self.workspace?.buildSystemManager.delegate = self
}
req.reply(InitializeResult(capabilities:
self.serverCapabilities(for: req.params.capabilities, registry: capabilityRegistry)))
}