mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-06-24 12:21:58 +02:00
223a88cb8c
- **`sourcekit/workspace/symbolNames`** — returns a flat, deduplicated list of every symbol name in the workspace index (source and indexed system modules). Clients use this to drive their search UI locally. - **`sourcekit/workspace/symbolInfo`** — given a list of exact symbol names, returns `WorkspaceSymbolItem` for each occurrence across all workspaces, for display in the search result list. Source-file symbols get `SymbolInformation` with a `file://` location. SDK/stdlib symbols get a `WorkspaceSymbol` with `location: .uri(…)` The client must call `workspaceSymbol/resolve` after the user selects an SDK/stdlib symbol to obtain the concrete interface location. - **`workspaceSymbol/resolve`** — resolves the deferred `WorkspaceSymbol` location from `sourcekit/workspace/symbolInfo`. Parses the `?module=` value into `moduleName`/`groupName`, finds a real source file via `mainFiles(containing:)`, calls `openGeneratedInterface`, and returns the symbol with `location` replaced by a full `sourcekit-lsp://generated-swift-interface/` URI + range (or a temp `file://` path for clients without `workspace/getReferenceDocument` support).
65 lines
2.3 KiB
Swift
65 lines
2.3 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import Foundation
|
|
@_spi(SourceKitLSP) package import LanguageServerProtocol
|
|
@_spi(SourceKitLSP) import SKLogging
|
|
package import SourceKitLSP
|
|
|
|
extension SwiftLanguageService {
|
|
package func openGeneratedInterface(
|
|
document: DocumentURI,
|
|
moduleName: String,
|
|
groupName: String?,
|
|
symbolUSR symbol: String?
|
|
) async throws -> GeneratedInterfaceDetails? {
|
|
// Include build settings context to distinguish different versions/configurations
|
|
let buildSettingsFileHash = "\(abs(document.buildSettingsFile.stringValue.hashValue))"
|
|
let sourcekitdDocumentName = [moduleName, groupName, buildSettingsFileHash].compactMap(\.self)
|
|
.joined(separator: ".")
|
|
|
|
let urlData = GeneratedInterfaceDocumentURLData(
|
|
moduleName: moduleName,
|
|
groupName: groupName,
|
|
sourcekitdDocumentName: sourcekitdDocumentName,
|
|
primaryFile: document
|
|
)
|
|
let position: Position? =
|
|
if let symbol {
|
|
await orLog("Getting position of USR") {
|
|
try await generatedInterfaceManager.position(ofUsr: symbol, in: urlData)
|
|
}
|
|
} else {
|
|
nil
|
|
}
|
|
|
|
if self.capabilityRegistry.clientHasWorkspaceGetReferenceDocumentSupport {
|
|
return GeneratedInterfaceDetails(uri: try urlData.uri, position: position)
|
|
}
|
|
let interfaceFilePath = self.generatedInterfacesPath
|
|
.appending(components: buildSettingsFileHash, urlData.displayName)
|
|
try FileManager.default.createDirectory(
|
|
at: interfaceFilePath.deletingLastPathComponent(),
|
|
withIntermediateDirectories: true
|
|
)
|
|
try await generatedInterfaceManager.snapshot(of: urlData).text.write(
|
|
to: interfaceFilePath,
|
|
atomically: true,
|
|
encoding: String.Encoding.utf8
|
|
)
|
|
return GeneratedInterfaceDetails(
|
|
uri: DocumentURI(interfaceFilePath),
|
|
position: position
|
|
)
|
|
}
|
|
}
|