@@ -271,8 +271,8 @@ private func createResolvedPackages(
271
271
}
272
272
273
273
// Gather and resolve module aliases specified for targets in all dependent packages
274
- let packageAliases = resolveModuleAliases ( packageBuilders: packageBuilders,
275
- observabilityScope: observabilityScope)
274
+ let packageAliases = try resolveModuleAliases ( packageBuilders: packageBuilders,
275
+ observabilityScope: observabilityScope)
276
276
277
277
// Scan and validate the dependencies
278
278
for packageBuilder in packageBuilders {
@@ -621,7 +621,7 @@ private func computePlatforms(
621
621
622
622
// Track and override module aliases specified for targets in a package graph
623
623
private func resolveModuleAliases( packageBuilders: [ ResolvedPackageBuilder ] ,
624
- observabilityScope: ObservabilityScope ) -> [ PackageIdentity : [ String : [ ModuleAliasModel ] ] ] ? {
624
+ observabilityScope: ObservabilityScope ) throws -> [ PackageIdentity : [ String : [ ModuleAliasModel ] ] ] ? {
625
625
626
626
// If there are no module aliases specified, return early
627
627
let hasAliases = packageBuilders. contains { $0. package . targets. contains {
@@ -647,17 +647,12 @@ private func resolveModuleAliases(packageBuilders: [ResolvedPackageBuilder],
647
647
648
648
if let aliasList = prodRef. moduleAliases {
649
649
for (depName, depAlias) in aliasList {
650
- if let existingAlias = aliasTracker. alias ( target: depName, originPackage: prodPkgID) {
651
- // Error if there are multiple aliases specified for this product dependency
652
- observabilityScope. emit ( PackageGraphError . multipleModuleAliases ( target: depName, product: prodRef. name, package : prodPkg, aliases: [ existingAlias, depAlias] ) )
653
- return nil
654
- }
655
650
// Track aliases for this product
656
- aliasTracker. addAlias ( depAlias,
657
- target: depName,
658
- product: prodRef. name,
659
- originPackage: PackageIdentity . plain ( prodPkg) ,
660
- consumingPackage: packageBuilder. package . identity)
651
+ try aliasTracker. addAlias ( depAlias,
652
+ target: depName,
653
+ product: prodRef. name,
654
+ originPackage: PackageIdentity . plain ( prodPkg) ,
655
+ consumingPackage: packageBuilder. package . identity)
661
656
}
662
657
}
663
658
}
@@ -667,16 +662,31 @@ private func resolveModuleAliases(packageBuilders: [ResolvedPackageBuilder],
667
662
668
663
// Track targets that need module aliases for each package
669
664
for packageBuilder in packageBuilders {
670
- for produdct in packageBuilder. package . products {
671
- var list = produdct. targets. map { $0. dependencies} . flatMap { $0} . compactMap { $0. target? . name}
672
- list. append ( contentsOf: produdct. targets. map { $0. name} )
673
- aliasTracker. addAliasesForTargets ( list, product: produdct. name, package : packageBuilder. package . identity)
665
+ for product in packageBuilder. package . products {
666
+ var allTargets = product. targets. map { $0. dependencies} . flatMap { $0} . compactMap { $0. target}
667
+ allTargets. append ( contentsOf: product. targets)
668
+ aliasTracker. addAliasesForTargets ( allTargets,
669
+ product: product. name,
670
+ package : packageBuilder. package . identity)
674
671
}
675
672
}
676
673
677
674
// Override module aliases upstream if needed
678
675
aliasTracker. propagateAliases ( )
679
676
677
+ // Validate sources (Swift files only) for modules being aliased.
678
+ // Needs to be done after `propagateAliases` since aliases defined
679
+ // upstream can be overriden.
680
+ for packageBuilder in packageBuilders {
681
+ for product in packageBuilder. package . products {
682
+ var allTargets = product. targets. map { $0. dependencies} . flatMap { $0} . compactMap { $0. target}
683
+ allTargets. append ( contentsOf: product. targets)
684
+ try aliasTracker. validateSources ( allTargets,
685
+ product: product. name,
686
+ package : packageBuilder. package . identity)
687
+ }
688
+ }
689
+
680
690
return aliasTracker. idTargetToAliases
681
691
}
682
692
@@ -694,7 +704,15 @@ private class ModuleAliasTracker {
694
704
target: String ,
695
705
product: String ,
696
706
originPackage: PackageIdentity ,
697
- consumingPackage: PackageIdentity ) {
707
+ consumingPackage: PackageIdentity ) throws {
708
+ if let aliasDict = aliasMap [ originPackage] {
709
+ let models = aliasDict. values. flatMap { $0} . filter { $0. name == target }
710
+ if !models. isEmpty {
711
+ // Error if there are multiple aliases specified for this product dependency
712
+ throw PackageGraphError . multipleModuleAliases ( target: target, product: product, package : originPackage. description, aliases: models. map { $0. alias} + [ alias] )
713
+ }
714
+ }
715
+
698
716
let model = ModuleAliasModel ( name: target, alias: alias, originPackage: originPackage, consumingPackage: consumingPackage)
699
717
aliasMap [ originPackage, default: [ : ] ] [ product, default: [ ] ] . append ( model)
700
718
}
@@ -710,31 +728,31 @@ private class ModuleAliasTracker {
710
728
}
711
729
}
712
730
713
- func addAliasesForTargets( _ targets: [ String ] ,
731
+ func addAliasesForTargets( _ targets: [ Target ] ,
714
732
product: String ,
715
733
package : PackageIdentity ) {
716
-
717
734
let aliases = aliasMap [ package ] ? [ product]
718
- for targetName in targets {
719
- if idTargetToAliases [ package ] ? [ targetName ] == nil {
720
- idTargetToAliases [ package , default: [ : ] ] [ targetName ] = [ ]
735
+ for target in targets {
736
+ if idTargetToAliases [ package ] ? [ target . name ] == nil {
737
+ idTargetToAliases [ package , default: [ : ] ] [ target . name ] = [ ]
721
738
}
722
739
723
740
if let aliases = aliases {
724
- idTargetToAliases [ package ] ? [ targetName ] ? . append ( contentsOf: aliases)
741
+ idTargetToAliases [ package ] ? [ target . name ] ? . append ( contentsOf: aliases)
725
742
}
726
743
}
727
744
}
728
745
729
- func alias( target: String ,
730
- originPackage: PackageIdentity ) -> String ? {
731
- if let aliasDict = aliasMap [ originPackage] {
732
- let models = aliasDict. values. flatMap { $0} . filter { $0. name == target }
733
- // this func only checks if there's any existing alias so
734
- // just return the first alias value
735
- return models. first? . alias
746
+ func validateSources( _ targets: [ Target ] ,
747
+ product: String ,
748
+ package : PackageIdentity ) throws {
749
+ for target in targets {
750
+ if let aliases = idTargetToAliases [ package ] ? [ target. name] , !aliases. isEmpty {
751
+ if target. sources. containsNonSwiftFiles {
752
+ throw PackageGraphError . invalidSourcesForModuleAliasing ( target: target. name, product: product, package : package . description)
753
+ }
754
+ }
736
755
}
737
- return nil
738
756
}
739
757
740
758
func propagateAliases( ) {
0 commit comments