Skip to content

Commit f35cff8

Browse files
committed
[PackageLoading] Eliminate inefficient module dependency resolution.
- This just builds a temporary map in advance instead of doing multiple linear searches over the same array.
1 parent fb946cf commit f35cff8

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

Sources/PackageLoading/PackageExtensions.swift

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -203,17 +203,29 @@ extension Package {
203203
}
204204
}
205205

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
208210
}
209211

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+
}
212223

224+
// Collect the dependencies.
213225
module.dependencies = try target.dependencies.map {
214226
switch $0 {
215227
case .Target(let name):
216-
guard let dependency = moduleForName(name) else {
228+
guard let dependency = modulesByName[name] else {
217229
throw ModuleError.modulesNotFound([name])
218230
}
219231
if dependency.type != .library {
@@ -224,13 +236,9 @@ extension Package {
224236
}
225237
}
226238

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)
234242
}
235243

236244
return modules
@@ -263,10 +271,6 @@ extension Package {
263271
guard let ext = path.asString.fileExt else { return false }
264272
return validExtensions.contains(ext)
265273
}
266-
267-
private func targetForName(_ name: String) -> Target? {
268-
return manifest.package.targets.pick{ $0.name == name }
269-
}
270274
}
271275

272276

0 commit comments

Comments
 (0)