diff --git a/CodeGeneration/Sources/generate-swift-syntax/GenerateSwiftSyntax.swift b/CodeGeneration/Sources/generate-swift-syntax/GenerateSwiftSyntax.swift index dd23798a666..a64b22f3d3e 100644 --- a/CodeGeneration/Sources/generate-swift-syntax/GenerateSwiftSyntax.swift +++ b/CodeGeneration/Sources/generate-swift-syntax/GenerateSwiftSyntax.swift @@ -139,7 +139,7 @@ struct GenerateSwiftSyntax: ParsableCommand { let modules = Set(fileSpecs.compactMap { $0.pathComponents.first }) - let previouslyGeneratedFilesLock = NSLock() + let filesAndErrorsLock = NSLock() var previouslyGeneratedFiles = Set( modules.flatMap { (module) -> [URL] in let generatedDir = @@ -163,9 +163,9 @@ struct GenerateSwiftSyntax: ParsableCommand { destination = destination.appendingPathComponent(component) } - previouslyGeneratedFilesLock.lock(); + filesAndErrorsLock.lock(); _ = previouslyGeneratedFiles.remove(destination) - previouslyGeneratedFilesLock.unlock() + filesAndErrorsLock.unlock() try generateFile( contents: fileSpec.contents, @@ -173,13 +173,14 @@ struct GenerateSwiftSyntax: ParsableCommand { verbose: verbose ) } catch { + filesAndErrorsLock.lock() errors.append(error) + filesAndErrorsLock.unlock() } } - if let firstError = errors.first { - // TODO: It would be nice if we could emit all errors - throw firstError + if errors.count > 0 { + throw ComposititeError(errors: errors) } for file in previouslyGeneratedFiles { @@ -210,3 +211,13 @@ struct GenerateSwiftSyntax: ParsableCommand { } } } + +struct ComposititeError: Error, CustomStringConvertible { + var errors: [Error] + var description: String { + "Multiple errors emitted:\n" + + errors + .map(String.init(describing:)) + .joined(separator: "\n") + } +}