Files
sourcekit-lsp/Sources/SourceKitLSP/CreateBuildSystem.swift
Alex Hoppen 7f90508e51 Add a document to describe which log level to use
Also change a few log levels and make all log messages consistently start with an uppercase letter.
2024-06-11 12:01:50 -07:00

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