Skip to content

Commit

Permalink
Make tool more async
Browse files Browse the repository at this point in the history
  • Loading branch information
dfed committed Jan 13, 2024
1 parent 21ac96d commit 1457bbd
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 45 deletions.
78 changes: 37 additions & 41 deletions Sources/SafeDITool/SafeDITool.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -70,28 +76,14 @@ 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,
instantiables: module.instantiables
)).write(toPath: moduleInfoOutput)
}

if let dependencyTreeOutput, let generatedCode = dependencyTree {
if let dependencyTreeOutput, let generatedCode = try await generatedCode {
try generatedCode.write(toPath: dependencyTreeOutput)
}
}
Expand Down Expand Up @@ -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
}
}
}

Expand Down
8 changes: 4 additions & 4 deletions Tests/SafeDIToolTests/SafeDIToolTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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 = []
Expand Down

0 comments on commit 1457bbd

Please sign in to comment.