Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Sources/Indexer/SourceFileCollector.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Logger
import SourceGraph
import SwiftIndexStore
import SystemPackage
import Shared

public struct SourceFileCollector {
private let indexStorePaths: Set<FilePath>
Expand Down
29 changes: 25 additions & 4 deletions Sources/Indexer/JobPool.swift → Sources/Shared/JobPool.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import Foundation
import Shared

struct JobPool<Job> {
public struct JobPool<Job> {
let jobs: [Job]

func forEach(_ block: @escaping (Job) throws -> Void) throws {
public init(jobs: [Job]) {
self.jobs = jobs
}

public func forEach(_ block: @escaping (Job) throws -> Void) throws {
var error: Error?

DispatchQueue.concurrentPerform(iterations: jobs.count) { idx in
Expand All @@ -23,7 +26,8 @@ struct JobPool<Job> {
}
}

func flatMap<Result>(_ block: @escaping (Job) throws -> [Result]) throws -> [Result] {
/// Throwing variant
public func flatMap<Result>(_ block: @escaping (Job) throws -> [Result]) throws -> [Result] {
var error: Error?
var results: [Result] = []
let lock = UnfairLock()
Expand All @@ -49,4 +53,21 @@ struct JobPool<Job> {

return results
}

/// Non-throwing variant
public func flatMap<Result>(_ block: @escaping (Job) -> [Result]) -> [Result] {
var results: [Result] = []
let lock = UnfairLock()

DispatchQueue.concurrentPerform(iterations: jobs.count) { idx in
let job = jobs[idx]
let result = block(job)

lock.perform {
results.append(contentsOf: result)
}
}

return results
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ final class ProtocolConformanceReferenceBuilder: SourceGraphMutator {
// MARK: - Private

private func referenceConformingDeclarationsImplementedInSuperclass() -> Set<Reference> {
var newReferences: Set<Reference> = []
let protocols = graph.declarations(ofKind: .protocol)

for proto in protocols {
let newReferences = Set(JobPool(jobs: Array(protocols)).flatMap { [graph] proto in
var result: [Reference] = []
// Find all classes that implement this protocol.
let conformingClasses = graph.references(to: proto)
.reduce(into: Set<Declaration>()) { result, ref in
Expand Down Expand Up @@ -66,13 +66,19 @@ final class ProtocolConformanceReferenceBuilder: SourceGraphMutator {
)
reference.name = declInSuperclass.name
reference.parent = unimplementedProtoDecl
graph.add(reference, from: unimplementedProtoDecl)
newReferences.insert(reference)
result.append(reference)
}
}
}
}
}
return result
})
// Perform mutations on the graph based on the calculated references
newReferences.forEach {
if let parent = $0.parent {
graph.add($0, from: parent)
}
}

return newReferences
Expand Down
Loading