diff --git a/Sources/SafeDITool/SafeDITool.swift b/Sources/SafeDITool/SafeDITool.swift index aef250ca..6b35cbda 100644 --- a/Sources/SafeDITool/SafeDITool.swift +++ b/Sources/SafeDITool/SafeDITool.swift @@ -50,17 +50,23 @@ struct SafeDITool: AsyncParsableCommand { @MainActor func run() async throws { - async let asyncDependentModuleInfo = try loadSafeDIModuleInfo( - atModuleInfoURLs: moduleInfoPaths.map(\.asFileURL) + let (dependentModuleInfo, module) = try await ( + loadSafeDIModuleInfo(atModuleInfoURLs: moduleInfoPaths.map(\.asFileURL)), + parsedModule(loadSwiftFiles()) ) - async let asyncSwiftFiles = try loadSwiftFiles() - let (dependentModuleInfo, swiftFiles) = try await (asyncDependentModuleInfo, asyncSwiftFiles) - let dependentImportStatements = dependentModuleInfo.flatMap(\.imports) + additionalImportedModules.map { ImportStatement(moduleName: $0) } - let dependentInstantiables = dependentModuleInfo.flatMap(\.instantiables) - let buildDependencyTreeOutput = dependencyTreeOutput != nil + async let generatedCode: String? = if dependencyTreeOutput != nil { + DependencyTreeGenerator( + importStatements: dependentModuleInfo.flatMap(\.imports) + additionalImportedModules.map { ImportStatement(moduleName: $0) } + module.imports, + typeDescriptionToFulfillingInstantiableMap: try resolveSafeDIFulfilledTypes( + instantiables: dependentModuleInfo.flatMap(\.instantiables) + module.instantiables + ) + ) + .generate() + } else { + nil + } - let module = parsedModule(swiftFiles) if !module.nestedInstantiableDecoratedTypeDescriptions.isEmpty { throw CollectInstantiablesError .foundNestedInstantiables( @@ -70,20 +76,6 @@ struct SafeDITool: AsyncParsableCommand { .sorted() ) } - - let dependencyTree: String? - if buildDependencyTreeOutput { - dependencyTree = try await DependencyTreeGenerator( - importStatements: dependentImportStatements + module.imports, - typeDescriptionToFulfillingInstantiableMap: try resolveSafeDIFulfilledTypes( - instantiables: dependentInstantiables + module.instantiables - ) - ) - .generate() - } else { - dependencyTree = nil - } - if let moduleInfoOutput { try JSONEncoder().encode(ModuleInfo( imports: module.imports, @@ -91,7 +83,7 @@ struct SafeDITool: AsyncParsableCommand { )).write(toPath: moduleInfoOutput) } - if let dependencyTreeOutput, let generatedCode = dependencyTree { + if let dependencyTreeOutput, let generatedCode = try await generatedCode { try generatedCode.write(toPath: dependencyTreeOutput) } } @@ -157,29 +149,33 @@ struct SafeDITool: AsyncParsableCommand { } private func loadSafeDIModuleInfo(atModuleInfoURLs moduleInfoURLs: [URL]) async throws -> [ModuleInfo] { - try await withThrowingTaskGroup( - of: ModuleInfo.self, - returning: [ModuleInfo].self - ) { taskGroup in + if moduleInfoURLs.isEmpty { + [] + } else { + try await withThrowingTaskGroup( + of: ModuleInfo.self, + returning: [ModuleInfo].self + ) { taskGroup in #if canImport(ZippyJSON) - let decoder = ZippyJSONDecoder() + let decoder = ZippyJSONDecoder() #else - let decoder = JSONDecoder() + let decoder = JSONDecoder() #endif - for moduleInfoURL in moduleInfoURLs { - taskGroup.addTask { - try decoder.decode( - ModuleInfo.self, - from: Data(contentsOf: moduleInfoURL) - ) + for moduleInfoURL in moduleInfoURLs { + taskGroup.addTask { + try decoder.decode( + ModuleInfo.self, + from: Data(contentsOf: moduleInfoURL) + ) + } + } + var allModuleInfo = [ModuleInfo]() + for try await moduleInfo in taskGroup { + allModuleInfo.append(moduleInfo) } - } - var allModuleInfo = [ModuleInfo]() - for try await moduleInfo in taskGroup { - allModuleInfo.append(moduleInfo) - } - return allModuleInfo + return allModuleInfo + } } } diff --git a/Tests/SafeDIToolTests/SafeDIToolTests.swift b/Tests/SafeDIToolTests/SafeDIToolTests.swift index 8fb6f95e..939693b3 100644 --- a/Tests/SafeDIToolTests/SafeDIToolTests.swift +++ b/Tests/SafeDIToolTests/SafeDIToolTests.swift @@ -3078,10 +3078,10 @@ final class SafeDIToolTests: XCTestCase { dependentModuleOutputPaths: [String] = [], buildDependencyTreeOutput: Bool ) async throws -> TestOutput { - let swiftFileCSV = URL.temporaryDirectory.appending(path: UUID().uuidString) + let swiftFileCSV = FileManager.default.temporaryDirectory.appending(path: UUID().uuidString) let swiftFiles = try swiftFileContent .map { - let location = URL.temporaryDirectory.appending(path: UUID().uuidString) + let location = FileManager.default.temporaryDirectory.appending(path: UUID().uuidString) try $0.write(to: location, atomically: true, encoding: .utf8) return location } @@ -3090,8 +3090,8 @@ final class SafeDIToolTests: XCTestCase { .joined(separator: ",") .write(to: swiftFileCSV, atomically: true, encoding: .utf8) - let moduleInfoOutput = URL.temporaryDirectory.appending(path: UUID().uuidString) - let dependencyTreeOutput = URL.temporaryDirectory.appending(path: UUID().uuidString) + let moduleInfoOutput = FileManager.default.temporaryDirectory.appending(path: UUID().uuidString) + let dependencyTreeOutput = FileManager.default.temporaryDirectory.appending(path: UUID().uuidString) var tool = SafeDITool() tool.swiftSourcesFilePath = swiftFileCSV.path() tool.additionalImportedModules = []