Files
sourcekit-lsp/Sources/SKCore/FallbackBuildSystem.swift
Ben Langmuir a679d4553d [buildsystem] Standardize call between register and settings query NFC
In preparation for injecting doing more during registration, pass
through the same parameters (add language) so that we can call settings
as necessary.
2020-02-05 21:53:52 -08:00

95 lines
2.9 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
/// 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 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
}
}
/// We don't support change watching.
public func registerForChangeNotifications(for: DocumentURI, language: Language) {}
/// 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, language: .swift)
}
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, language: language)
}
}