Skip to content

Commit

Permalink
Improve performance (#131)
Browse files Browse the repository at this point in the history
  • Loading branch information
dfed authored Dec 31, 2024
1 parent 99f3daf commit bc974a1
Showing 1 changed file with 21 additions and 33 deletions.
54 changes: 21 additions & 33 deletions Sources/SafeDITool/SafeDITool.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ struct SafeDITool: AsyncParsableCommand, Sendable {

let (dependentModuleInfo, module) = try await (
loadSafeDIModuleInfo(),
parsedModule(loadSwiftFiles())
parsedModule()
)

let unnormalizedInstantiables = dependentModuleInfo.flatMap(\.instantiables) + module.instantiables
Expand Down Expand Up @@ -199,48 +199,36 @@ struct SafeDITool: AsyncParsableCommand, Sendable {
}
}

private func loadSwiftFiles() async throws -> [String] {
private func parsedModule() async throws -> ParsedModule {
try await withThrowingTaskGroup(
of: String.self,
returning: [String].self
of: (imports: [ImportStatement], instantiables: [Instantiable])?.self,
returning: ParsedModule.self
) { taskGroup in
var imports = [ImportStatement]()
var instantiables = [Instantiable]()
for filePath in try await findSwiftFiles() where !filePath.isEmpty {
taskGroup.addTask {
let swiftFile = try String(contentsOfFile: filePath, encoding: .utf8)
if swiftFile.contains("@\(InstantiableVisitor.macroName)") {
return swiftFile
} else {
// We don't care about this file.
return ""
}
let content = try String(contentsOfFile: filePath, encoding: .utf8)
guard content.contains("@\(InstantiableVisitor.macroName)") else { return nil }
let fileVisitor = FileVisitor()
fileVisitor.walk(Parser.parse(source: content))
guard !fileVisitor.instantiables.isEmpty else { return nil }
return (imports: fileVisitor.imports, instantiables: fileVisitor.instantiables)
}
}
var swiftFiles = [String]()
for try await swiftFile in taskGroup {
if !swiftFile.isEmpty {
swiftFiles.append(swiftFile)

for try await fileInfo in taskGroup {
if let fileInfo {
imports.append(contentsOf: fileInfo.imports)
instantiables.append(contentsOf: fileInfo.instantiables)
}
}
return swiftFiles
}
}

private func parsedModule(_ swiftFileContent: [String]) -> ParsedModule {
var imports = [ImportStatement]()
var instantiables = [Instantiable]()
for content in swiftFileContent {
let fileVisitor = FileVisitor()
fileVisitor.walk(Parser.parse(source: content))
if !fileVisitor.instantiables.isEmpty {
imports.append(contentsOf: fileVisitor.imports)
instantiables.append(contentsOf: fileVisitor.instantiables)
}
return ParsedModule(
imports: imports,
instantiables: instantiables
)
}

return ParsedModule(
imports: imports,
instantiables: instantiables
)
}

var moduleInfoURLs: Set<URL> {
Expand Down

0 comments on commit bc974a1

Please sign in to comment.