func _cursorInfo()

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
  }