@@ -74,7 +74,7 @@ extension PackageGraph {
74
74
// Sort all manifests toplogically.
75
75
allManifests = try topologicalSort ( inputManifests, successors: successors)
76
76
}
77
- var flattenedManifests : [ String : GraphLoadingNode ] = [ : ]
77
+ /* var flattenedManifests: [String: GraphLoadingNode] = [:]
78
78
for node in allManifests {
79
79
if let existing = flattenedManifests[node.manifest.name] {
80
80
let merged = GraphLoadingNode(
@@ -85,9 +85,23 @@ extension PackageGraph {
85
85
} else {
86
86
flattenedManifests[node.manifest.name] = node
87
87
}
88
- }
89
- allManifests = flattenedManifests. values. sorted ( by: { $0. manifest. name < $1. manifest. name } )
88
+ }*/
90
89
90
+ var flattenedManifests : [ PackageIdentity : GraphLoadingNode ] = [ : ]
91
+ for node in allManifests {
92
+ let packageIdentity = identityResolver. resolveIdentity ( for: node. manifest. packageLocation)
93
+ if let existing = flattenedManifests [ packageIdentity] {
94
+ let merged = GraphLoadingNode (
95
+ manifest: node. manifest,
96
+ productFilter: existing. productFilter. union ( node. productFilter)
97
+ )
98
+ flattenedManifests [ packageIdentity] = merged
99
+ } else {
100
+ flattenedManifests [ packageIdentity] = node
101
+ }
102
+ }
103
+ allManifests = flattenedManifests. values. sorted ( by: { identityResolver. resolveIdentity ( for: $0. manifest. packageLocation) < identityResolver. resolveIdentity ( for: $1. manifest. packageLocation) } )
104
+
91
105
// Create the packages.
92
106
var manifestToPackage : [ Manifest : Package ] = [ : ]
93
107
for node in allManifests {
@@ -179,7 +193,7 @@ private func checkAllDependenciesAreUsed(_ rootPackages: [ResolvedPackage], _ di
179
193
}
180
194
181
195
let dependencyIsUsed = dependency. products. contains ( where: productDependencies. contains)
182
- if !dependencyIsUsed {
196
+ if !dependencyIsUsed && !diagnostics . hasErrors {
183
197
diagnostics. emit ( . unusedDependency( dependency. name) )
184
198
}
185
199
}
@@ -211,11 +225,18 @@ private func createResolvedPackages(
211
225
}
212
226
213
227
// Create a map of package builders keyed by the package identity.
228
+ // This is guaranteed to be unique so we can use spm_createDictionary
214
229
let packageMapByIdentity : [ PackageIdentity : ResolvedPackageBuilder ] = packageBuilders. spm_createDictionary {
215
230
let identity = identityResolver. resolveIdentity ( for: $0. package . manifest. packageLocation)
216
231
return ( identity, $0)
217
232
}
218
- let packageMapByName : [ String : ResolvedPackageBuilder ] = packageBuilders. spm_createDictionary { ( $0. package . name, $0) }
233
+
234
+ // in case packages have same manifest name this map can miss packages which will lead to missing product errors
235
+ // our plan is to deprecate the use of manifest + dependency explicit name in target dependency lookup and instead lean 100% on identity
236
+ // which means this map would go away too
237
+ let packageMapByNameForTargetDependencyResolutionOnly = packageBuilders. reduce ( into: [ String: ResolvedPackageBuilder] ( ) , { partial, item in
238
+ partial [ item. package . name] = item
239
+ } )
219
240
220
241
// Scan and validate the dependencies
221
242
for packageBuilder in packageBuilders {
@@ -235,7 +256,7 @@ private func createResolvedPackages(
235
256
}
236
257
237
258
// Use the package name to lookup the dependency. The package name will be present in packages with tools version >= 5.2.
238
- if let explicitDependencyName = dependency. explicitNameForTargetDependencyResolutionOnly, let resolvedPackage = packageMapByName [ explicitDependencyName] {
259
+ if let explicitDependencyName = dependency. explicitNameForTargetDependencyResolutionOnly, let resolvedPackage = packageMapByNameForTargetDependencyResolutionOnly [ explicitDependencyName] {
239
260
guard !dependencies. contains ( resolvedPackage) else {
240
261
// check if this resolvedPackage already listed in the dependencies
241
262
// this means that the dependencies share the same name
@@ -409,7 +430,7 @@ private func createResolvedPackages(
409
430
if let packageName = productRef. package {
410
431
// Find the declared package and check that it contains
411
432
// the product we found above.
412
- guard let dependencyPackage = packageMapByName [ packageName] , dependencyPackage. products. contains ( product) else {
433
+ guard let dependencyPackage = packageMapByNameForTargetDependencyResolutionOnly [ packageName] , dependencyPackage. products. contains ( product) else {
413
434
let error = PackageGraphError . productDependencyIncorrectPackage (
414
435
name: productRef. name,
415
436
package : packageName
0 commit comments