1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
//===----------------------------------------------------------------------===//
//
// 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: SourceKitLSPOptions,
testHooks: TestHooks,
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,
options: options,
reloadPackageStatusCallback: reloadPackageStatusCallback,
testHooks: testHooks.swiftpmTestHooks
)
}
func createCompilationDatabaseBuildSystem(rootPath: AbsolutePath) -> CompilationDatabaseBuildSystem? {
return CompilationDatabaseBuildSystem(
projectRoot: rootPath,
searchPaths: (options.compilationDatabase.searchPaths ?? []).compactMap { try? RelativePath(validating: $0) }
)
}
func createBuildServerBuildSystem(rootPath: AbsolutePath) async -> BuildServerBuildSystem? {
return await BuildServerBuildSystem(projectRoot: rootPath)
}
let defaultBuildSystem: BuildSystem? =
switch options.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
}
}
|