Skip to content

Commit afcd86a

Browse files
authored
Fix product lookup (#6376)
For module aliasing, we changed the product lookup to include package identity, but product references can use a local identity as specified by the `name` attribute of the package dependency declaration. So for packages where the local `name` attribute didn't match the identity, we would not longer find the corresponding products at all. This switches us back to use the local identity that is also called `explicitNameForTargetDependencyResolutionOnly` in package reference. rdar://106578471
1 parent addc8d2 commit afcd86a

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

Sources/PackageGraph/PackageGraph+Loading.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ private func createResolvedPackages(
267267

268268
var dependencies = OrderedCollections.OrderedDictionary<PackageIdentity, ResolvedPackageBuilder>()
269269
var dependenciesByNameForTargetDependencyResolution = [String: ResolvedPackageBuilder]()
270+
var dependencyNamesForTargetDependencyResolutionOnly = [PackageIdentity: String]()
270271

271272
// Establish the manifest-declared package dependencies.
272273
package.manifest.dependenciesRequired(for: packageBuilder.productFilter).forEach { dependency in
@@ -334,12 +335,14 @@ private func createResolvedPackages(
334335

335336
let nameForTargetDependencyResolution = dependency.explicitNameForTargetDependencyResolutionOnly ?? dependency.identity.description
336337
dependenciesByNameForTargetDependencyResolution[nameForTargetDependencyResolution] = resolvedPackage
338+
dependencyNamesForTargetDependencyResolutionOnly[resolvedPackage.package.identity] = nameForTargetDependencyResolution
337339

338340
dependencies[resolvedPackage.package.identity] = resolvedPackage
339341
}
340342
}
341343

342344
packageBuilder.dependencies = Array(dependencies.values)
345+
packageBuilder.dependencyNamesForTargetDependencyResolutionOnly = dependencyNamesForTargetDependencyResolutionOnly
343346

344347
packageBuilder.defaultLocalization = package.manifest.defaultLocalization
345348

@@ -441,7 +444,13 @@ private func createResolvedPackages(
441444

442445
let productDependencyMap: [String: ResolvedProductBuilder]
443446
if lookupByProductIDs {
444-
productDependencyMap = productDependencies.spm_createDictionary { ($0.product.identity, $0) }
447+
productDependencyMap = try Dictionary(uniqueKeysWithValues: productDependencies.map {
448+
guard let packageName = packageBuilder.dependencyNamesForTargetDependencyResolutionOnly[$0.packageBuilder.package.identity] else {
449+
throw InternalError("could not determine name for dependency on package '\($0.packageBuilder.package.identity)' from package '\(packageBuilder.package.identity)'")
450+
}
451+
let key = "\(packageName.lowercased())_\($0.product.name)"
452+
return (key, $0)
453+
})
445454
} else {
446455
productDependencyMap = try Dictionary(
447456
productDependencies.map { ($0.product.name, $0) },
@@ -962,6 +971,9 @@ private final class ResolvedPackageBuilder: ResolvedBuilder<ResolvedPackage> {
962971
/// The dependencies of this package.
963972
var dependencies: [ResolvedPackageBuilder] = []
964973

974+
/// Map from package identity to the local name for target dependency resolution that has been given to that package through the dependency declaration.
975+
var dependencyNamesForTargetDependencyResolutionOnly: [PackageIdentity: String] = [:]
976+
965977
/// The defaultLocalization for this package.
966978
var defaultLocalization: String? = nil
967979

Tests/PackageGraphTests/PackageGraphTests.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2550,6 +2550,43 @@ class PackageGraphTests: XCTestCase {
25502550

25512551
XCTAssertEqual(observability.diagnostics.count, 0, "unexpected diagnostics: \(observability.diagnostics.map { $0.description })")
25522552
}
2553+
2554+
func testCustomNameInPackageDependency() throws {
2555+
let fs = InMemoryFileSystem(emptyFiles:
2556+
"/Foo/Sources/Foo/source.swift",
2557+
"/Bar2/Sources/Bar/source.swift"
2558+
)
2559+
2560+
let observability = ObservabilitySystem.makeForTesting()
2561+
_ = try loadPackageGraph(
2562+
fileSystem: fs,
2563+
manifests: [
2564+
Manifest.createRootManifest(
2565+
displayName: "Foo",
2566+
path: .init(path: "/Foo"),
2567+
toolsVersion: .v5_9,
2568+
dependencies: [
2569+
.fileSystem(deprecatedName: "Bar", path: "/Bar2"),
2570+
],
2571+
targets: [
2572+
TargetDescription(name: "Foo", dependencies: [.product(name: "Bar", package: "BAR")]),
2573+
]),
2574+
Manifest.createFileSystemManifest(
2575+
displayName: "Bar",
2576+
path: .init(path: "/Bar2"),
2577+
toolsVersion: .v5_9,
2578+
products: [
2579+
ProductDescription(name: "Bar", type: .library(.automatic), targets: ["Bar"]),
2580+
],
2581+
targets: [
2582+
TargetDescription(name: "Bar"),
2583+
]),
2584+
],
2585+
observabilityScope: observability.topScope
2586+
)
2587+
2588+
XCTAssertEqual(observability.diagnostics.count, 0, "unexpected diagnostics: \(observability.diagnostics.map { $0.description })")
2589+
}
25532590
}
25542591

25552592

0 commit comments

Comments
 (0)