mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
This allows sourcekit-lsp to make use of the path remappings recently added to the index store and IndexStoreDB to remap remote paths into local paths when loading index data locally. These remappings can be provided via the `-index-prefix-map` command line flag to sourcekit-lsp or via the `BuildSystem` integration point.
110 lines
3.4 KiB
Swift
110 lines
3.4 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2020 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 BuildServerProtocol
|
|
import LanguageServerProtocol
|
|
import TSCBasic
|
|
import enum TSCUtility.Platform
|
|
import Dispatch
|
|
|
|
/// A simple BuildSystem suitable as a fallback when accurate settings are unknown.
|
|
public final class FallbackBuildSystem: BuildSystem {
|
|
|
|
public init() {}
|
|
|
|
/// The path to the SDK.
|
|
public lazy var sdkpath: AbsolutePath? = {
|
|
if case .darwin? = Platform.currentPlatform,
|
|
let str = try? Process.checkNonZeroExit(
|
|
args: "/usr/bin/xcrun", "--show-sdk-path", "--sdk", "macosx"),
|
|
let path = try? AbsolutePath(validating: str.spm_chomp())
|
|
{
|
|
return path
|
|
}
|
|
return nil
|
|
}()
|
|
|
|
/// Delegate to handle any build system events.
|
|
public weak var delegate: BuildSystemDelegate? = nil
|
|
|
|
public var indexStorePath: AbsolutePath? { return nil }
|
|
|
|
public var indexDatabasePath: AbsolutePath? { return nil }
|
|
|
|
public var indexPrefixMappings: [PathPrefixMapping] { return [] }
|
|
|
|
public func settings(for uri: DocumentURI, _ language: Language) -> FileBuildSettings? {
|
|
switch language {
|
|
case .swift:
|
|
return settingsSwift(uri.pseudoPath)
|
|
case .c, .cpp, .objective_c, .objective_cpp:
|
|
return settingsClang(uri.pseudoPath, language)
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
public func registerForChangeNotifications(for uri: DocumentURI, language: Language) {
|
|
guard let delegate = self.delegate else { return }
|
|
|
|
let settings = self.settings(for: uri, language)
|
|
DispatchQueue.global().async {
|
|
delegate.fileBuildSettingsChanged([uri: FileBuildSettingsChange(settings)])
|
|
}
|
|
}
|
|
|
|
/// We don't support change watching.
|
|
public func unregisterForChangeNotifications(for: DocumentURI) {}
|
|
|
|
public func buildTargets(reply: @escaping (LSPResult<[BuildTarget]>) -> Void) {
|
|
reply(.failure(buildTargetsNotSupported))
|
|
}
|
|
|
|
public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[SourcesItem]>) -> Void) {
|
|
reply(.failure(buildTargetsNotSupported))
|
|
}
|
|
|
|
public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[OutputsItem]>) -> Void) {
|
|
reply(.failure(buildTargetsNotSupported))
|
|
}
|
|
|
|
func settingsSwift(_ file: String) -> FileBuildSettings {
|
|
var args: [String] = []
|
|
if let sdkpath = sdkpath {
|
|
args += [
|
|
"-sdk",
|
|
sdkpath.pathString,
|
|
]
|
|
}
|
|
args.append(file)
|
|
return FileBuildSettings(compilerArguments: args)
|
|
}
|
|
|
|
func settingsClang(_ file: String, _ language: Language) -> FileBuildSettings {
|
|
var args: [String] = []
|
|
if let sdkpath = sdkpath {
|
|
args += [
|
|
"-isysroot",
|
|
sdkpath.pathString,
|
|
]
|
|
}
|
|
args.append(file)
|
|
return FileBuildSettings(compilerArguments: args)
|
|
}
|
|
|
|
public func filesDidChange(_ events: [FileEvent]) {}
|
|
|
|
public func fileHandlingCapability(for uri: DocumentURI) -> FileHandlingCapability {
|
|
return .fallback
|
|
}
|
|
}
|