Skip to content

Commit 434b2b2

Browse files
authored
Early return when module aliases are not defined (#4193)
Early return when module aliases are not defined Move stack push out of a nested loop Resolves rdar://89776259
1 parent 7e2db85 commit 434b2b2

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

Sources/PackageGraph/PackageGraph+Loading.swift

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ private func createResolvedPackages(
265265
}
266266

267267
// Gather all module aliases specified for targets in all dependent packages
268-
let pkgToAliasesMap = gatherModuleAliases(for: rootManifests.first?.key, with: packagesByIdentity, onError: observabilityScope)
268+
let packageAliases = gatherModuleAliases(from: packageBuilders, for: rootManifests.first?.key, with: packagesByIdentity, onError: observabilityScope)
269269

270270
// Scan and validate the dependencies
271271
for packageBuilder in packageBuilders {
@@ -276,7 +276,7 @@ private func createResolvedPackages(
276276
metadata: package.diagnosticsMetadata
277277
)
278278

279-
if let aliasMap = pkgToAliasesMap[package.identity] {
279+
if let aliasMap = packageAliases?[package.identity] {
280280
package.setModuleAliasesForTargets(with: aliasMap)
281281
}
282282

@@ -523,9 +523,20 @@ private func createResolvedPackages(
523523
}
524524

525525
// Create a map between a package and module aliases specified for the targets in the package.
526-
private func gatherModuleAliases(for rootPkgID: PackageIdentity?,
526+
private func gatherModuleAliases(from packageBuilders: [ResolvedPackageBuilder],
527+
for rootPkgID: PackageIdentity?,
527528
with packagesByIdentity: [PackageIdentity: ResolvedPackageBuilder],
528-
onError observabilityScope: ObservabilityScope) -> [PackageIdentity: [String: String]] {
529+
onError observabilityScope: ObservabilityScope) -> [PackageIdentity: [String: String]]? {
530+
// If there are no aliases, return early
531+
let depsWithAliases = packageBuilders.map { $0.package.targets.map { $0.dependencies.filter { dep in
532+
if case let .product(prodRef, _) = dep {
533+
return prodRef.moduleAliases != nil
534+
}
535+
return false
536+
}}}.flatMap{$0}.flatMap{$0}
537+
538+
guard !depsWithAliases.isEmpty else { return nil }
539+
529540
var result = [PackageIdentity: [String: String]]()
530541

531542
// There could be multiple root packages but the common cases involve
@@ -580,14 +591,13 @@ private func walkPkgTreeAndGetModuleAliases(for pkgID: PackageIdentity,
580591
break
581592
}
582593
}
583-
584-
// Add pkgID to a stack used to keep track of multiple
585-
// aliases specified in the package chain. Need to add
586-
// pkgID here, otherwise need pkgID != pkgInChain check
587-
// in the for loop above
588-
pkgStack.append(pkgID)
589594
}
590-
595+
// Add pkgID to a stack used to keep track of multiple
596+
// aliases specified in the package chain. Need to add
597+
// pkgID here, otherwise need pkgID != pkgInChain check
598+
// in the for loop above
599+
pkgStack.append(pkgID)
600+
591601
// Recursively (depth-first) walk the package dependency tree
592602
for pkgDep in builder.package.manifest.dependencies {
593603
walkPkgTreeAndGetModuleAliases(for: pkgDep.identity, with: packagesByIdentity, onError: observabilityScope, using: &pkgStack, output: &result)

0 commit comments

Comments
 (0)