From a087692725a30c38614dd095602fca03d141f5ad Mon Sep 17 00:00:00 2001 From: Alex Hoppen Date: Fri, 22 Nov 2024 22:31:11 +0100 Subject: [PATCH] Return compiler arguments for invalid package manifests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, when there‘s a syntax error in a package manifest, we don’t get any build settings from it in SourceKit-LSP and thus loose almost all semantic functionality. If we can’t parse the package manifest, fall back to providing build settings by assuming it has the current Swift tools version. Currently, when there‘s a syntax error in a package manifest, we don’t get any build settings from it in SourceKit-LSP and thus loose almost all semantic functionality. If we can’t parse the package manifest, fall back to providing build settings by assuming it has the current Swift tools version. Fixes #1704 rdar://136423767 --- .../SwiftPMBuildSystem.swift | 2 +- .../SwiftPMBuildSystemTests.swift | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift index 90b7cf4ca..adb790a74 100644 --- a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift +++ b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift @@ -783,7 +783,7 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem { /// Retrieve settings for a package manifest (Package.swift). private func settings(forPackageManifest path: AbsolutePath) throws -> TextDocumentSourceKitOptionsResponse? { - let compilerArgs = swiftPMWorkspace.interpreterFlags(for: path.parentDirectory) + [path.pathString] + let compilerArgs = try swiftPMWorkspace.interpreterFlags(for: path) + [path.pathString] return TextDocumentSourceKitOptionsResponse(compilerArguments: compilerArgs) } } diff --git a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift index 339ea64f0..f800b0a2f 100644 --- a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift +++ b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift @@ -1148,6 +1148,39 @@ final class SwiftPMBuildSystemTests: XCTestCase { XCTAssert(compilerArgs.contains(try versionSpecificManifestURL.filePath)) } } + + func testBuildSettingsForInvalidManifest() async throws { + try await withTestScratchDir { tempDir in + try FileManager.default.createFiles( + root: tempDir, + files: [ + "pkg/Sources/lib/a.swift": "", + "pkg/Package.swift": """ + // swift-tools-version: 4.2 + import PackageDescription + """, + ] + ) + let packageRoot = try tempDir.appendingPathComponent("pkg").realpath + let manifestURL = packageRoot.appendingPathComponent("Package.swift") + let buildSystemManager = await BuildSystemManager( + buildSystemSpec: BuildSystemSpec(kind: .swiftPM, projectRoot: packageRoot), + toolchainRegistry: .forTesting, + options: SourceKitLSPOptions(), + connectionToClient: DummyBuildSystemManagerConnectionToClient(), + buildSystemTestHooks: BuildSystemTestHooks() + ) + await buildSystemManager.waitForUpToDateBuildGraph() + let settings = await buildSystemManager.buildSettingsInferredFromMainFile( + for: DocumentURI(manifestURL), + language: .swift, + fallbackAfterTimeout: false + ) + let compilerArgs = try XCTUnwrap(settings?.compilerArguments) + XCTAssert(compilerArgs.contains("-package-description-version")) + XCTAssert(compilerArgs.contains(try manifestURL.filePath)) + } + } } private func assertArgumentsDoNotContain(