Files
sourcekit-lsp/Sources/SwiftLanguageService/OpenInterface.swift
2025-10-31 14:11:11 -07:00

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
)
}
}