@@ -203,17 +203,29 @@ extension Package {
203
203
}
204
204
}
205
205
206
- func moduleForName( _ name: String ) -> Module ? {
207
- return modules. pick { $0. name == name }
206
+ // Create a map of modules indexed by name.
207
+ var modulesByName = [ String: Module] ( )
208
+ for module in modules {
209
+ modulesByName [ module. name] = module
208
210
}
209
211
210
- for module in modules {
211
- guard let target = targetForName ( module. name) else { continue }
212
+ // Collect the declared module dependencies from the manifest.
213
+ //
214
+ // The remaining modules are left with their (empty) dependencies.
215
+ var missingModuleNames = [ String] ( )
216
+ for target in manifest. package . targets {
217
+ // Find the matching module.
218
+ guard let module = modulesByName [ target. name] else {
219
+ // The manifest referenced an undefined module.
220
+ missingModuleNames. append ( target. name)
221
+ continue
222
+ }
212
223
224
+ // Collect the dependencies.
213
225
module. dependencies = try target. dependencies. map {
214
226
switch $0 {
215
227
case . Target( let name) :
216
- guard let dependency = moduleForName ( name) else {
228
+ guard let dependency = modulesByName [ name] else {
217
229
throw ModuleError . modulesNotFound ( [ name] )
218
230
}
219
231
if dependency. type != . library {
@@ -224,13 +236,9 @@ extension Package {
224
236
}
225
237
}
226
238
227
- /// Check for targets that are not mapped to any modules.
228
- let targetNames = Set ( manifest. package . targets. map { $0. name } )
229
- let moduleNames = Set ( modules. map { $0. name } )
230
- let diff = targetNames. subtracting ( moduleNames)
231
-
232
- guard diff. isEmpty else {
233
- throw ModuleError . modulesNotFound ( Array ( diff) )
239
+ // Check for targets that are not mapped to any modules.
240
+ guard missingModuleNames. isEmpty else {
241
+ throw ModuleError . modulesNotFound ( missingModuleNames)
234
242
}
235
243
236
244
return modules
@@ -263,10 +271,6 @@ extension Package {
263
271
guard let ext = path. asString. fileExt else { return false }
264
272
return validExtensions. contains ( ext)
265
273
}
266
-
267
- private func targetForName( _ name: String ) -> Target ? {
268
- return manifest. package . targets. pick { $0. name == name }
269
- }
270
274
}
271
275
272
276
0 commit comments