diff --git a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift index c8e92edc..18c92809 100644 --- a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift +++ b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift @@ -169,9 +169,7 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem { private var targetDependencies: [BuildTargetIdentifier: Set] = [:] static package func projectRoot(for path: URL, options: SourceKitLSPOptions) -> URL? { - guard var path = orLog("Getting realpath for project root", { try path.realpath }) else { - return nil - } + var path = path while true { let packagePath = path.appendingPathComponent("Package.swift") if (try? String(contentsOf: packagePath, encoding: .utf8))?.contains("PackageDescription") ?? false { diff --git a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift index 213450c7..05616f9e 100644 --- a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift +++ b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift @@ -806,28 +806,21 @@ final class SwiftPMBuildSystemTests: XCTestCase { fallbackAfterTimeout: false ) ).compilerArguments - let argumentsFromReal = try await unwrap( - buildSystemManager.buildSettingsInferredFromMainFile( - for: DocumentURI(aswiftReal), - language: .swift, - fallbackAfterTimeout: false - ) - ).compilerArguments - // The arguments retrieved from the symlink and the real document should be the same, except that both should - // contain they file the build settings were created. - // FIXME: Or should the build settings always reference the main file? - XCTAssertEqual( - try argumentsFromSymlink.filter { try $0 != aswiftSymlink.filePath && $0 != aswiftReal.filePath }, - try argumentsFromReal.filter { try $0 != aswiftSymlink.filePath && $0 != aswiftReal.filePath } + // We opened the project from a symlink. The realpath isn't part of the project and we should thus not receive + // build settings for it. + assertTrue( + try await unwrap( + buildSystemManager.buildSettingsInferredFromMainFile( + for: DocumentURI(aswiftReal), + language: .swift, + fallbackAfterTimeout: false + ) + ).isFallback ) - assertArgumentsContain(try aswiftSymlink.filePath, arguments: argumentsFromSymlink) assertArgumentsDoNotContain(try aswiftReal.filePath, arguments: argumentsFromSymlink) - assertArgumentsContain(try aswiftReal.filePath, arguments: argumentsFromReal) - assertArgumentsDoNotContain(try aswiftSymlink.filePath, arguments: argumentsFromReal) - let argsManifest = try await unwrap( buildSystemManager.buildSettingsInferredFromMainFile( for: DocumentURI(manifest),