@@ -706,6 +706,20 @@ public class BuildPlan: SPMBuildCore.BuildPlan {
706
706
}
707
707
return inputs
708
708
}
709
+
710
+ public func description(
711
+ for product: ResolvedProduct ,
712
+ context: BuildParameters . Destination
713
+ ) -> ProductBuildDescription ? {
714
+ return self . productMap [ product. id]
715
+ }
716
+
717
+ public func description(
718
+ for module: ResolvedModule ,
719
+ context: BuildParameters . Destination
720
+ ) -> ModuleBuildDescription ? {
721
+ return self . targetMap [ module. id]
722
+ }
709
723
}
710
724
711
725
extension BuildPlan {
@@ -1117,6 +1131,59 @@ extension BuildPlan {
1117
1131
}
1118
1132
}
1119
1133
}
1134
+
1135
+ package func traverseDependencies(
1136
+ of description: ModuleBuildDescription ,
1137
+ onProduct: ( ResolvedProduct , BuildParameters . Destination , ProductBuildDescription ? ) -> Void ,
1138
+ onModule: ( ResolvedModule , BuildParameters . Destination , ModuleBuildDescription ? ) -> Void
1139
+ ) {
1140
+ func successors(
1141
+ for product: ResolvedProduct ,
1142
+ destination: Destination
1143
+ ) -> [ TraversalNode ] {
1144
+ product. modules. map { module in
1145
+ TraversalNode ( module: module, context: destination)
1146
+ }
1147
+ }
1148
+
1149
+ func successors(
1150
+ for module: ResolvedModule ,
1151
+ destination: Destination
1152
+ ) -> [ TraversalNode ] {
1153
+ module
1154
+ . dependencies ( satisfying: description. buildParameters. buildEnvironment)
1155
+ . reduce ( into: [ TraversalNode] ( ) ) { partial, dependency in
1156
+ switch dependency {
1157
+ case . product( let product, _) :
1158
+ partial. append ( . init( product: product, context: destination) )
1159
+ case . module( let module, _) :
1160
+ partial. append ( . init( module: module, context: destination) )
1161
+ }
1162
+ }
1163
+ }
1164
+
1165
+ depthFirstSearch ( successors ( for: description. module, destination: description. destination) ) {
1166
+ switch $0 {
1167
+ case . module( let module, let destination) :
1168
+ successors ( for: module, destination: destination)
1169
+ case . product( let product, let destination) :
1170
+ successors ( for: product, destination: destination)
1171
+ case . package :
1172
+ [ ]
1173
+ }
1174
+ } onNext: { module, _, _ in
1175
+ switch module {
1176
+ case . package :
1177
+ break
1178
+
1179
+ case . product( let product, let destination) :
1180
+ onProduct ( product, destination, self . description ( for: product, context: destination) )
1181
+
1182
+ case . module( let module, let destination) :
1183
+ onModule ( module, destination, self . description ( for: module, context: destination) )
1184
+ }
1185
+ }
1186
+ }
1120
1187
}
1121
1188
1122
1189
extension Basics . Diagnostic {
0 commit comments