in Sources/SourceKitLSP/Swift/CodeCompletionSession.swift [99:153]
func _open(
filterText: String,
position: Position,
in snapshot: DocumentSnapshot,
options: SKCompletionOptions,
completion: @escaping (LSPResult<CompletionList>) -> Void)
{
log("\(Self.self) Open: \(self) filter=\(filterText)")
assert(snapshot.version == self.snapshot.version, "open must use the original snapshot")
let req = SKDRequestDictionary(sourcekitd: server.sourcekitd)
let keys = server.sourcekitd.keys
req[keys.request] = server.sourcekitd.requests.codecomplete_open
req[keys.offset] = utf8StartOffset
req[keys.name] = uri.pseudoPath
req[keys.sourcefile] = uri.pseudoPath
req[keys.sourcetext] = snapshot.text
req[keys.codecomplete_options] = optionsDictionary(filterText: filterText, options: options)
if let compileCommand = compileCommand {
req[keys.compilerargs] = compileCommand.compilerArgs
}
let group = DispatchGroup()
group.enter()
state = .opening(group)
let handle = server.sourcekitd.send(req, queue) { result in
defer { group.leave() }
guard let dict = result.success else {
self.state = .closed
return completion(.failure(ResponseError(result.failure!)))
}
if case .closed = self.state {
return completion(.failure(.cancelled))
}
self.state = .open
guard let completions: SKDResponseArray = dict[keys.results] else {
return completion(.success(CompletionList(isIncomplete: false, items: [])))
}
let results = self.server.completionsFromSKDResponse(completions,
in: snapshot,
completionPos: self.position,
requestPosition: position,
isIncomplete: true)
completion(.success(results))
}
// FIXME: cancellation
_ = handle
}