From c7531694348228207ca17624cb9a8d3e2d54a0ac Mon Sep 17 00:00:00 2001 From: Paul LeMarquand Date: Wed, 3 Jul 2024 10:06:31 -0400 Subject: [PATCH] Respect module name argument order precedence When the same flag is specified multiple times the last one found is used. --- Sources/SKCore/BuildSystemManager.swift | 4 +- .../WorkspaceTestDiscoveryTests.swift | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/Sources/SKCore/BuildSystemManager.swift b/Sources/SKCore/BuildSystemManager.swift index 92a824fad..3e45c7683 100644 --- a/Sources/SKCore/BuildSystemManager.swift +++ b/Sources/SKCore/BuildSystemManager.swift @@ -166,14 +166,14 @@ extension BuildSystemManager { switch language { case .swift: // Module name is specified in the form -module-name MyLibrary - guard let moduleNameFlagIndex = buildSettings.compilerArguments.firstIndex(of: "-module-name") else { + guard let moduleNameFlagIndex = buildSettings.compilerArguments.lastIndex(of: "-module-name") else { return nil } return buildSettings.compilerArguments[safe: moduleNameFlagIndex + 1] case .objective_c: // Specified in the form -fmodule-name=MyLibrary guard - let moduleNameArgument = buildSettings.compilerArguments.first(where: { + let moduleNameArgument = buildSettings.compilerArguments.last(where: { $0.starts(with: "-fmodule-name=") }), let moduleName = moduleNameArgument.split(separator: "=").last diff --git a/Tests/SourceKitLSPTests/WorkspaceTestDiscoveryTests.swift b/Tests/SourceKitLSPTests/WorkspaceTestDiscoveryTests.swift index 3aeebc265..a182ccf83 100644 --- a/Tests/SourceKitLSPTests/WorkspaceTestDiscoveryTests.swift +++ b/Tests/SourceKitLSPTests/WorkspaceTestDiscoveryTests.swift @@ -305,6 +305,57 @@ final class WorkspaceTestDiscoveryTests: XCTestCase { ) } + func testTargetWithCustomModuleName() async throws { + let packageManifestWithCustomModuleName = """ + let package = Package( + name: "MyLibrary", + targets: [ + .testTarget( + name: "MyLibraryTests", + swiftSettings: [ + .unsafeFlags(["-module-name", "Foo", "-module-name", "Bar"]) + ] + ) + ] + ) + """ + + let project = try await SwiftPMTestProject( + files: [ + "Tests/MyLibraryTests/MyTests.swift": """ + import XCTest + + 1️⃣class MyTests: XCTestCase { + 2️⃣func testMyLibrary() {}3️⃣ + }4️⃣ + """ + ], + manifest: packageManifestWithCustomModuleName + ) + + // Last argument takes precedence, so expect Bar as the module name. + + let tests = try await project.testClient.send(WorkspaceTestsRequest()) + + XCTAssertEqual( + tests, + [ + TestItem( + id: "Bar.MyTests", + label: "MyTests", + location: try project.location(from: "1️⃣", to: "4️⃣", in: "MyTests.swift"), + children: [ + TestItem( + id: "Bar.MyTests/testMyLibrary()", + label: "testMyLibrary()", + location: try project.location(from: "2️⃣", to: "3️⃣", in: "MyTests.swift") + ) + ] + ) + ] + ) + } + func testMultipleTargetsWithSameXCTestClassName() async throws { let packageManifestWithTwoTestTargets = """ let package = Package(