diff --git a/Sources/ProjectSpec/Dependency.swift b/Sources/ProjectSpec/Dependency.swift index 0ab99b5d..36089a24 100644 --- a/Sources/ProjectSpec/Dependency.swift +++ b/Sources/ProjectSpec/Dependency.swift @@ -38,6 +38,12 @@ public struct Dependency: Equatable { } } +extension Dependency: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(reference) + } +} + extension Dependency: JSONObjectConvertible { public init(jsonDictionary: JSONDictionary) throws { diff --git a/Sources/XcodeGenKit/CarthageDependencyResolver.swift b/Sources/XcodeGenKit/CarthageDependencyResolver.swift index 8654211d..78b92969 100644 --- a/Sources/XcodeGenKit/CarthageDependencyResolver.swift +++ b/Sources/XcodeGenKit/CarthageDependencyResolver.swift @@ -42,7 +42,7 @@ public struct CarthageDependencyResolver { func dependencies(for topLevelTarget: Target) -> [Dependency] { // this is used to resolve cyclical target dependencies var visitedTargets: Set = [] - var frameworks: [String: Dependency] = [:] + var frameworks: Set = [] var queue: [ProjectTarget] = [topLevelTarget] while !queue.isEmpty { @@ -53,17 +53,16 @@ public struct CarthageDependencyResolver { if let target = projectTarget as? Target { // don't overwrite frameworks, to allow top level ones to rule - let nonExistingDepsPredicate: (Dependency) -> Bool = { return frameworks[$0.reference] == nil } - let nonExistentDependencies = target.dependencies.filter(nonExistingDepsPredicate) + let nonExistentDependencies = target.dependencies.filter { !frameworks.contains($0) } for dependency in nonExistentDependencies { switch dependency.type { case .carthage(let includeRelated): if includeRelated == true { relatedDependencies(for: dependency, in: target.platform) - .filter(nonExistingDepsPredicate) - .forEach { frameworks[$0.reference] = $0 } + .filter { !frameworks.contains($0) } + .forEach { frameworks.insert($0) } } else { - frameworks[dependency.reference] = dependency + frameworks.insert(dependency) } case .target: if let projectTarget = project.getProjectTarget(dependency.reference) { @@ -90,7 +89,7 @@ public struct CarthageDependencyResolver { visitedTargets.update(with: projectTarget.name) } - return frameworks.sorted(by: { $0.key < $1.key }).map { $0.value } + return frameworks.sorted(by: { $0.reference < $1.reference }) } /// Reads the .version file generated for a given Carthage dependency