@@ -1175,8 +1175,8 @@ extension BuildPlan {
1175
1175
1176
1176
package func traverseDependencies(
1177
1177
of description: ModuleBuildDescription ,
1178
- onProduct: ( ResolvedProduct , BuildParameters . Destination , ProductBuildDescription ? ) -> DepthFirstContinue ,
1179
- onModule: ( ResolvedModule , BuildParameters . Destination , ModuleBuildDescription ? ) -> DepthFirstContinue
1178
+ onProduct: ( ResolvedProduct , BuildParameters . Destination , ProductBuildDescription ? ) -> Void ,
1179
+ onModule: ( ResolvedModule , BuildParameters . Destination , ModuleBuildDescription ? ) -> Void
1180
1180
) {
1181
1181
var visited = Set < TraversalNode > ( )
1182
1182
func successors(
@@ -1217,16 +1217,92 @@ extension BuildPlan {
1217
1217
case . package :
1218
1218
[ ]
1219
1219
}
1220
- } visitNext : { module, _ in
1220
+ } onNext : { module, _ in
1221
1221
switch module {
1222
1222
case . package :
1223
- return . continue
1223
+ break
1224
+
1225
+ case . product( let product, let destination) :
1226
+ onProduct ( product, destination, self . description ( for: product, context: destination) )
1227
+
1228
+ case . module( let module, let destination) :
1229
+ onModule ( module, destination, self . description ( for: module, context: destination) )
1230
+ }
1231
+ }
1232
+ }
1233
+
1234
+ // Only follow link time dependencies, i.e. skip dependencies on macros and plugins
1235
+ // except for testTargets that depend on macros.
1236
+ package func traverseLinkDependencies(
1237
+ of description: ModuleBuildDescription ,
1238
+ onProduct: ( ResolvedProduct , BuildParameters . Destination , ProductBuildDescription ? ) -> Void ,
1239
+ onModule: ( ResolvedModule , BuildParameters . Destination , ModuleBuildDescription ? ) -> Void
1240
+ ) {
1241
+ var visited = Set < TraversalNode > ( )
1242
+ func successors(
1243
+ for product: ResolvedProduct ,
1244
+ destination: Destination
1245
+ ) -> [ TraversalNode ] {
1246
+ product. modules. map { module in
1247
+ TraversalNode ( module: module, context: destination)
1248
+ } . filter {
1249
+ visited. insert ( $0) . inserted
1250
+ }
1251
+ }
1252
+
1253
+ func successors(
1254
+ for parentModule: ResolvedModule ,
1255
+ destination: Destination
1256
+ ) -> [ TraversalNode ] {
1257
+ parentModule
1258
+ . dependencies ( satisfying: description. buildParameters. buildEnvironment)
1259
+ . reduce ( into: [ TraversalNode] ( ) ) { partial, dependency in
1260
+ switch dependency {
1261
+ case . product( let product, _) :
1262
+ guard product. type != . plugin else {
1263
+ return
1264
+ }
1265
+
1266
+ guard product. type != . macro || parentModule. type == . test else {
1267
+ return
1268
+ }
1269
+
1270
+ partial. append ( . init( product: product, context: destination) )
1271
+ case . module( let childModule, _) :
1272
+ guard childModule. type != . plugin else {
1273
+ return
1274
+ }
1275
+
1276
+ guard childModule. type != . macro || parentModule. type == . test else {
1277
+ return
1278
+ }
1279
+
1280
+ partial. append ( . init( module: childModule, context: destination) )
1281
+ }
1282
+ } . filter {
1283
+ visited. insert ( $0) . inserted
1284
+ }
1285
+ }
1286
+
1287
+ depthFirstSearch ( successors ( for: description. module, destination: description. destination) ) {
1288
+ switch $0 {
1289
+ case . module( let module, let destination) :
1290
+ successors ( for: module, destination: destination)
1291
+ case . product( let product, let destination) :
1292
+ successors ( for: product, destination: destination)
1293
+ case . package :
1294
+ [ ]
1295
+ }
1296
+ } onNext: { module, _ in
1297
+ switch module {
1298
+ case . package :
1299
+ break
1224
1300
1225
1301
case . product( let product, let destination) :
1226
- return onProduct ( product, destination, self . description ( for: product, context: destination) )
1302
+ onProduct ( product, destination, self . description ( for: product, context: destination) )
1227
1303
1228
1304
case . module( let module, let destination) :
1229
- return onModule ( module, destination, self . description ( for: module, context: destination) )
1305
+ onModule ( module, destination, self . description ( for: module, context: destination) )
1230
1306
}
1231
1307
}
1232
1308
}
0 commit comments