mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
Also change a few log levels and make all log messages consistently start with an uppercase letter.
77 lines
3.0 KiB
Swift
77 lines
3.0 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2024 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 LSPLogging
|
|
import LanguageServerProtocol
|
|
import SKCore
|
|
import SKSwiftPMWorkspace
|
|
|
|
import struct TSCBasic.AbsolutePath
|
|
import struct TSCBasic.RelativePath
|
|
|
|
/// Tries to create a build system for a workspace at the given location, with the given parameters.
|
|
func createBuildSystem(
|
|
rootUri: DocumentURI,
|
|
options: SourceKitLSPServer.Options,
|
|
toolchainRegistry: ToolchainRegistry,
|
|
reloadPackageStatusCallback: @Sendable @escaping (ReloadPackageStatus) async -> Void
|
|
) async -> BuildSystem? {
|
|
guard let rootUrl = rootUri.fileURL, let rootPath = try? AbsolutePath(validating: rootUrl.path) else {
|
|
// We assume that workspaces are directories. This is only true for URLs not for URIs in general.
|
|
// Simply skip setting up the build integration in this case.
|
|
logger.error(
|
|
"Cannot setup build integration at URI \(rootUri.forLogging) because the URI it is not a valid file URL"
|
|
)
|
|
return nil
|
|
}
|
|
func createSwiftPMBuildSystem(rootUri: DocumentURI) async -> SwiftPMBuildSystem? {
|
|
return await SwiftPMBuildSystem(
|
|
uri: rootUri,
|
|
toolchainRegistry: toolchainRegistry,
|
|
buildSetup: options.buildSetup,
|
|
experimentalFeatures: options.experimentalFeatures,
|
|
reloadPackageStatusCallback: reloadPackageStatusCallback
|
|
)
|
|
}
|
|
|
|
func createCompilationDatabaseBuildSystem(rootPath: AbsolutePath) -> CompilationDatabaseBuildSystem? {
|
|
return CompilationDatabaseBuildSystem(
|
|
projectRoot: rootPath,
|
|
searchPaths: options.compilationDatabaseSearchPaths
|
|
)
|
|
}
|
|
|
|
func createBuildServerBuildSystem(rootPath: AbsolutePath) async -> BuildServerBuildSystem? {
|
|
return await BuildServerBuildSystem(projectRoot: rootPath, buildSetup: options.buildSetup)
|
|
}
|
|
|
|
let defaultBuildSystem: BuildSystem? =
|
|
switch options.buildSetup.defaultWorkspaceType {
|
|
case .buildServer: await createBuildServerBuildSystem(rootPath: rootPath)
|
|
case .compilationDatabase: createCompilationDatabaseBuildSystem(rootPath: rootPath)
|
|
case .swiftPM: await createSwiftPMBuildSystem(rootUri: rootUri)
|
|
case nil: nil
|
|
}
|
|
if let defaultBuildSystem {
|
|
return defaultBuildSystem
|
|
} else if let buildServer = await createBuildServerBuildSystem(rootPath: rootPath) {
|
|
return buildServer
|
|
} else if let swiftpm = await createSwiftPMBuildSystem(rootUri: rootUri) {
|
|
return swiftpm
|
|
} else if let compdb = createCompilationDatabaseBuildSystem(rootPath: rootPath) {
|
|
return compdb
|
|
} else {
|
|
logger.error("Could not set up a build system at '\(rootUri.forLogging)'")
|
|
return nil
|
|
}
|
|
}
|