diff --git a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift index 55da3710f..e789d1c2e 100644 --- a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift +++ b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift @@ -537,16 +537,29 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem { // (https://github.com/swiftlang/sourcekit-lsp/issues/1267) for target in request.targets { if target == .forPackageManifest { + let packageManifestName = #/^Package@swift-(\d+)(?:\.(\d+))?(?:\.(\d+))?.swift$/# + let versionSpecificManifests = try? FileManager.default.contentsOfDirectory( + at: projectRoot, + includingPropertiesForKeys: nil + ).compactMap { (url) -> SourceItem? in + guard (try? packageManifestName.wholeMatch(in: url.lastPathComponent)) != nil else { + return nil + } + return SourceItem( + uri: DocumentURI(url), + kind: .file, + generated: false + ) + } + let packageManifest = SourceItem( + uri: DocumentURI(projectRoot.appendingPathComponent("Package.swift")), + kind: .file, + generated: false + ) result.append( SourcesItem( target: target, - sources: [ - SourceItem( - uri: DocumentURI(projectRoot.appendingPathComponent("Package.swift")), - kind: .file, - generated: false - ) - ] + sources: [packageManifest] + (versionSpecificManifests ?? []) ) ) } diff --git a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift index 7d676b7a2..339ea64f0 100644 --- a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift +++ b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift @@ -1103,6 +1103,51 @@ final class SwiftPMBuildSystemTests: XCTestCase { XCTAssertEqual(end.token, begin.token) XCTAssertEqual(end.value, .end(WorkDoneProgressEnd())) } + + func testBuildSettingsForVersionSpecificPackageManifest() 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 package = Package( + name: "a", + targets: [.target(name: "lib")] + ) + """, + "pkg/Package@swift-5.8.swift": """ + // swift-tools-version:4.2 + import PackageDescription + let package = Package( + name: "a", + targets: [.target(name: "lib")] + ) + """, + ] + ) + let packageRoot = try tempDir.appendingPathComponent("pkg").realpath + let versionSpecificManifestURL = packageRoot.appendingPathComponent("Package@swift-5.8.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(versionSpecificManifestURL), + language: .swift, + fallbackAfterTimeout: false + ) + let compilerArgs = try XCTUnwrap(settings?.compilerArguments) + XCTAssert(compilerArgs.contains("-package-description-version")) + XCTAssert(compilerArgs.contains(try versionSpecificManifestURL.filePath)) + } + } } private func assertArgumentsDoNotContain(