in Sources/SourceKitLSP/Swift/CursorInfo.swift [76:149]
func _cursorInfo(
_ uri: DocumentURI,
_ range: Range<Position>,
additionalParameters appendAdditionalParameters: ((SKDRequestDictionary) -> Void)? = nil,
_ completion: @escaping (Swift.Result<CursorInfo?, CursorInfoError>) -> Void)
{
guard let snapshot = documentManager.latestSnapshot(uri) else {
return completion(.failure(.unknownDocument(uri)))
}
guard let offsetRange = snapshot.utf8OffsetRange(of: range) else {
return completion(.failure(.invalidRange(range)))
}
let keys = self.keys
let skreq = SKDRequestDictionary(sourcekitd: sourcekitd)
skreq[keys.request] = requests.cursorinfo
skreq[keys.offset] = offsetRange.lowerBound
if offsetRange.upperBound != offsetRange.lowerBound {
skreq[keys.length] = offsetRange.count
}
skreq[keys.sourcefile] = snapshot.document.uri.pseudoPath
// FIXME: SourceKit should probably cache this for us.
if let compileCommand = self.commandsByFile[uri] {
skreq[keys.compilerargs] = compileCommand.compilerArgs
}
appendAdditionalParameters?(skreq)
let handle = self.sourcekitd.send(skreq, self.queue) { [weak self] result in
guard let self = self else { return }
guard let dict = result.success else {
return completion(.failure(.responseError(ResponseError(result.failure!))))
}
guard let _: sourcekitd_uid_t = dict[keys.kind] else {
// Nothing to report.
return completion(.success(nil))
}
var location: Location? = nil
if let filepath: String = dict[keys.filepath],
let offset: Int = dict[keys.offset],
let pos = snapshot.positionOf(utf8Offset: offset)
{
location = Location(uri: DocumentURI(URL(fileURLWithPath: filepath)), range: Range(pos))
}
let refactorActionsArray: SKDResponseArray? = dict[keys.refactor_actions]
completion(.success(
CursorInfo(
SymbolDetails(
name: dict[keys.name],
containerName: nil,
usr: dict[keys.usr],
bestLocalDeclaration: location),
annotatedDeclaration: dict[keys.annotated_decl],
documentationXML: dict[keys.doc_full_as_xml],
refactorActions:
[SemanticRefactorCommand](
array: refactorActionsArray,
range: range,
textDocument: TextDocumentIdentifier(uri),
keys,
self.sourcekitd.api)
)))
}
// FIXME: cancellation
_ = handle
}