mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
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.clientHasExperimentalCapability(GetReferenceDocumentRequest.method) {
|
|
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
|
|
)
|
|
}
|
|
}
|