diff --git a/Sources/BuildSystemIntegration/BuildServerBuildSystem.swift b/Sources/BuildSystemIntegration/BuildServerBuildSystem.swift index 2aabe68c..a448cd88 100644 --- a/Sources/BuildSystemIntegration/BuildServerBuildSystem.swift +++ b/Sources/BuildSystemIntegration/BuildServerBuildSystem.swift @@ -328,7 +328,7 @@ extension BuildServerBuildSystem: BuiltInBuildSystem { ) } - package func waitForUpBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse { + package func waitForBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse { return VoidResponse() } } diff --git a/Sources/BuildSystemIntegration/BuiltInBuildSystem.swift b/Sources/BuildSystemIntegration/BuiltInBuildSystem.swift index af149abf..4e374dd7 100644 --- a/Sources/BuildSystemIntegration/BuiltInBuildSystem.swift +++ b/Sources/BuildSystemIntegration/BuiltInBuildSystem.swift @@ -71,5 +71,5 @@ package protocol BuiltInBuildSystem: AnyObject, Sendable { ) async throws -> TextDocumentSourceKitOptionsResponse? /// Wait until the build graph has been loaded. - func waitForUpBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse + func waitForBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse } diff --git a/Sources/BuildSystemIntegration/BuiltInBuildSystemAdapter.swift b/Sources/BuildSystemIntegration/BuiltInBuildSystemAdapter.swift index b3affd8b..b0a81472 100644 --- a/Sources/BuildSystemIntegration/BuiltInBuildSystemAdapter.swift +++ b/Sources/BuildSystemIntegration/BuiltInBuildSystemAdapter.swift @@ -167,7 +167,7 @@ package actor BuiltInBuildSystemAdapter: QueueBasedMessageHandler { case let request as RequestAndReply: await request.reply { try await underlyingBuildSystem.buildTargets(request: request.params) } case let request as RequestAndReply: - await request.reply { await underlyingBuildSystem.waitForUpBuildSystemUpdates(request: request.params) } + await request.reply { await underlyingBuildSystem.waitForBuildSystemUpdates(request: request.params) } default: await request.reply { throw ResponseError.methodNotFound(Request.method) } } diff --git a/Sources/BuildSystemIntegration/CompilationDatabaseBuildSystem.swift b/Sources/BuildSystemIntegration/CompilationDatabaseBuildSystem.swift index 3d9bc65f..cc25ba6d 100644 --- a/Sources/BuildSystemIntegration/CompilationDatabaseBuildSystem.swift +++ b/Sources/BuildSystemIntegration/CompilationDatabaseBuildSystem.swift @@ -48,7 +48,14 @@ fileprivate enum Cachable { /// /// Provides build settings from a `CompilationDatabase` found by searching a project. For now, only /// one compilation database, located at the project root. -package actor CompilationDatabaseBuildSystem { +package actor CompilationDatabaseBuildSystem: BuiltInBuildSystem { + static package func projectRoot(for workspaceFolder: AbsolutePath, options: SourceKitLSPOptions) -> AbsolutePath? { + if tryLoadCompilationDatabase(directory: workspaceFolder) != nil { + return workspaceFolder + } + return nil + } + /// The compilation database. var compdb: CompilationDatabase? = nil { didSet { @@ -58,14 +65,12 @@ package actor CompilationDatabaseBuildSystem { } } - package let connectionToSourceKitLSP: any Connection + private let connectionToSourceKitLSP: any Connection + private let searchPaths: [RelativePath] + private let fileSystem: FileSystem package let projectRoot: AbsolutePath - let searchPaths: [RelativePath] - - let fileSystem: FileSystem - private var _indexStorePath: Cachable = .noValue package var indexStorePath: AbsolutePath? { _indexStorePath.get { @@ -87,6 +92,12 @@ package actor CompilationDatabaseBuildSystem { } } + package var indexDatabasePath: AbsolutePath? { + indexStorePath?.parentDirectory.appending(component: "IndexDatabase") + } + + package nonisolated var supportsPreparation: Bool { false } + package init?( projectRoot: AbsolutePath, searchPaths: [RelativePath], @@ -103,21 +114,6 @@ package actor CompilationDatabaseBuildSystem { return nil } } -} - -extension CompilationDatabaseBuildSystem: BuiltInBuildSystem { - static package func projectRoot(for workspaceFolder: AbsolutePath, options: SourceKitLSPOptions) -> AbsolutePath? { - if tryLoadCompilationDatabase(directory: workspaceFolder) != nil { - return workspaceFolder - } - return nil - } - - package nonisolated var supportsPreparation: Bool { false } - - package var indexDatabasePath: AbsolutePath? { - indexStorePath?.parentDirectory.appending(component: "IndexDatabase") - } package func buildTargets(request: WorkspaceBuildTargetsRequest) async throws -> WorkspaceBuildTargetsResponse { return WorkspaceBuildTargetsResponse(targets: [ @@ -135,10 +131,7 @@ extension CompilationDatabaseBuildSystem: BuiltInBuildSystem { } package func buildTargetSources(request: BuildTargetSourcesRequest) async throws -> BuildTargetSourcesResponse { - guard request.targets.contains(.dummy) else { - return BuildTargetSourcesResponse(items: []) - } - guard let compdb else { + guard request.targets.contains(.dummy), let compdb else { return BuildTargetSourcesResponse(items: []) } return BuildTargetSourcesResponse(items: [SourcesItem(target: .dummy, sources: compdb.sourceItems)]) @@ -157,7 +150,7 @@ extension CompilationDatabaseBuildSystem: BuiltInBuildSystem { package func sourceKitOptions( request: TextDocumentSourceKitOptionsRequest ) async throws -> TextDocumentSourceKitOptionsResponse? { - guard let db = database(for: request.textDocument.uri), let cmd = db[request.textDocument.uri].first else { + guard let compdb, let cmd = compdb[request.textDocument.uri].first else { return nil } return TextDocumentSourceKitOptionsResponse( @@ -166,36 +159,10 @@ extension CompilationDatabaseBuildSystem: BuiltInBuildSystem { ) } - package func waitForUpBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse { + package func waitForBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse { return VoidResponse() } - private func database(for uri: DocumentURI) -> CompilationDatabase? { - if let url = uri.fileURL, let path = try? AbsolutePath(validating: url.path) { - return database(for: path) - } - return compdb - } - - private func database(for path: AbsolutePath) -> CompilationDatabase? { - if compdb == nil { - var dir = path - while !dir.isRoot { - dir = dir.parentDirectory - if let db = tryLoadCompilationDatabase(directory: dir, additionalSearchPaths: searchPaths, fileSystem) { - compdb = db - break - } - } - } - - if compdb == nil { - logger.error("Could not open compilation database for \(path)") - } - - return compdb - } - private func fileEventShouldTriggerCompilationDatabaseReload(event: FileEvent) -> Bool { switch event.uri.fileURL?.lastPathComponent { case "compile_commands.json", "compile_flags.txt": diff --git a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift index 96ca7667..d534f149 100644 --- a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift +++ b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift @@ -650,7 +650,7 @@ extension SwiftPMBuildSystem: BuildSystemIntegration.BuiltInBuildSystem { return [] } - package func waitForUpBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse { + package func waitForBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse { await self.packageLoadingQueue.async {}.valuePropagatingCancellation return VoidResponse() } diff --git a/Sources/BuildSystemIntegration/TestBuildSystem.swift b/Sources/BuildSystemIntegration/TestBuildSystem.swift index dbc2e312..12b3ea6f 100644 --- a/Sources/BuildSystemIntegration/TestBuildSystem.swift +++ b/Sources/BuildSystemIntegration/TestBuildSystem.swift @@ -83,7 +83,7 @@ package actor TestBuildSystem: BuiltInBuildSystem { return buildSettingsByFile[request.textDocument.uri] } - package func waitForUpBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse { + package func waitForBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest) async -> VoidResponse { return VoidResponse() } diff --git a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift index 940e73fc..864b3c2e 100644 --- a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift +++ b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift @@ -44,7 +44,7 @@ fileprivate extension SwiftPMBuildSystem { } func waitForUpToDateBuildGraph() async { - let _: VoidResponse = await self.waitForUpBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest()) + let _: VoidResponse = await self.waitForBuildSystemUpdates(request: WorkspaceWaitForBuildSystemUpdatesRequest()) } }