From df53fed1234df403a5f5492409e806bf237e56cf Mon Sep 17 00:00:00 2001 From: Cal Stephens Date: Wed, 13 Mar 2024 12:58:30 -0700 Subject: [PATCH] Expand serialParse flag to also apply to Composer.uniqueTypesAndFunctions (#1301) --- Sourcery/Sourcery.swift | 2 +- .../Sources/Common/Array+Parallel.swift | 4 ++-- .../Sources/Common/Composer/Composer.swift | 15 ++++++++++++--- .../Sources/Common/TemplateContext.swift | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Sourcery/Sourcery.swift b/Sourcery/Sourcery.swift index cfa5b8371..b5d57b12d 100644 --- a/Sourcery/Sourcery.swift +++ b/Sourcery/Sourcery.swift @@ -405,7 +405,7 @@ extension Sourcery { let uniqueTypeStart = currentTimestamp() // ! All files have been scanned, time to join extensions with base class - let (types, functions, typealiases) = Composer.uniqueTypesAndFunctions(parserResult) + let (types, functions, typealiases) = Composer.uniqueTypesAndFunctions(parserResult, serial: serialParse) let filesThatHadToBeParsed = allResults diff --git a/SourceryRuntime/Sources/Common/Array+Parallel.swift b/SourceryRuntime/Sources/Common/Array+Parallel.swift index 9ad8d0390..02bc31208 100644 --- a/SourceryRuntime/Sources/Common/Array+Parallel.swift +++ b/SourceryRuntime/Sources/Common/Array+Parallel.swift @@ -24,9 +24,9 @@ public extension Array { } } - func parallelPerform(transform: (Element) -> Void) { + func parallelPerform(_ work: (Element) -> Void) { DispatchQueue.concurrentPerform(iterations: count) { idx in - transform(self[idx]) + work(self[idx]) } } } diff --git a/SourceryRuntime/Sources/Common/Composer/Composer.swift b/SourceryRuntime/Sources/Common/Composer/Composer.swift index 98cc2a675..aa0461001 100644 --- a/SourceryRuntime/Sources/Common/Composer/Composer.swift +++ b/SourceryRuntime/Sources/Common/Composer/Composer.swift @@ -19,8 +19,9 @@ public enum Composer { /// - filters out any private types and extensions /// /// - Parameter parserResult: Result of parsing source code. + /// - Parameter serial: Whether to process results serially instead of concurrently /// - Returns: Final types and extensions of unknown types. - public static func uniqueTypesAndFunctions(_ parserResult: FileParserResult) -> (types: [Type], functions: [SourceryMethod], typealiases: [Typealias]) { + public static func uniqueTypesAndFunctions(_ parserResult: FileParserResult, serial: Bool = false) -> (types: [Type], functions: [SourceryMethod], typealiases: [Typealias]) { let composed = ParserResultsComposed(parserResult: parserResult) let resolveType = { (typeName: TypeName, containingType: Type?) -> Type? in @@ -31,7 +32,7 @@ public enum Composer { return composed.resolveType(typeName: typeName, containingType: containingType, method: method) } - composed.types.parallelPerform { type in + let processType = { (type: Type) in type.variables.forEach { resolveVariableTypes($0, of: type, resolve: resolveType) } @@ -55,10 +56,18 @@ public enum Composer { } } - composed.functions.parallelPerform { function in + let processFunction = { (function: SourceryMethod) in resolveMethodTypes(function, of: nil, resolve: methodResolveType) } + if serial { + composed.types.forEach(processType) + composed.functions.forEach(processFunction) + } else { + composed.types.parallelPerform(processType) + composed.functions.parallelPerform(processFunction) + } + updateTypeRelationships(types: composed.types) return ( diff --git a/SourceryRuntime/Sources/Common/TemplateContext.swift b/SourceryRuntime/Sources/Common/TemplateContext.swift index bb83eb4f4..65d89ab61 100644 --- a/SourceryRuntime/Sources/Common/TemplateContext.swift +++ b/SourceryRuntime/Sources/Common/TemplateContext.swift @@ -48,7 +48,7 @@ public final class TemplateContext: NSObject, SourceryModel, NSCoding, Diffable let fileParserResultCopy: FileParserResult? = nil // fileParserResultCopy = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(NSKeyedArchiver.archivedData(withRootObject: parserResult)) as? FileParserResult - let composed = Composer.uniqueTypesAndFunctions(parserResult) + let composed = Composer.uniqueTypesAndFunctions(parserResult, serial: false) self.types = .init(types: composed.types, typealiases: composed.typealiases) self.functions = composed.functions