From d2d6019cabed6e04a04bef402442697f9c32df11 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 16 Sep 2023 15:02:13 +0100 Subject: Create separate error when processes fail --- .../shedlang/compiler/backends/ProcessRunner.java | 26 ----------------- .../compiler/backends/llvm/LlvmBackend.java | 2 +- .../compiler/backends/llvm/LlvmCompiler.java | 2 +- .../compiler/backends/wasm/WasmBackend.java | 2 +- .../compiler/util/processes/ProcessError.java | 13 +++++++++ .../compiler/util/processes/ProcessExitError.java | 7 +++++ .../compiler/util/processes/ProcessRunner.java | 33 ++++++++++++++++++++++ .../compiler/util/processes/ProcessStartError.java | 7 +++++ 8 files changed, 63 insertions(+), 29 deletions(-) delete mode 100644 src/main/java/org/shedlang/compiler/backends/ProcessRunner.java create mode 100644 src/main/java/org/shedlang/compiler/util/processes/ProcessError.java create mode 100644 src/main/java/org/shedlang/compiler/util/processes/ProcessExitError.java create mode 100644 src/main/java/org/shedlang/compiler/util/processes/ProcessRunner.java create mode 100644 src/main/java/org/shedlang/compiler/util/processes/ProcessStartError.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/ProcessRunner.java b/src/main/java/org/shedlang/compiler/backends/ProcessRunner.java deleted file mode 100644 index d71bd25b..00000000 --- a/src/main/java/org/shedlang/compiler/backends/ProcessRunner.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.shedlang.compiler.backends; - -import java.io.IOException; -import java.util.List; - -public class ProcessRunner { - private ProcessRunner() { - } - - /** - * Run a process until it exits, inheriting standard IO from its parent - * process. - */ - public static void runInheritIo(List args) throws IOException, InterruptedException { - var process = new ProcessBuilder(args) - .inheritIO() - .start(); - - var exitCode = process.waitFor(); - if (exitCode != 0) { - // TODO: better error code - throw new RuntimeException("exit code: " + exitCode); - } - } - -} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java index 69f6a710..a3d2af91 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -import static org.shedlang.compiler.backends.ProcessRunner.runInheritIo; +import static org.shedlang.compiler.util.processes.ProcessRunner.runInheritIo; public class LlvmBackend implements Backend { public static final LlvmBackend DIRECT = new LlvmBackend("llvm", new CodeGen() { diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java index 04e13b39..b9d82386 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java @@ -11,7 +11,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import static org.shedlang.compiler.backends.ProcessRunner.runInheritIo; +import static org.shedlang.compiler.util.processes.ProcessRunner.runInheritIo; public class LlvmCompiler { private final Path workingDirectory; diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java index 10102a0a..584d8832 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java @@ -21,7 +21,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import static org.shedlang.compiler.backends.ProcessRunner.runInheritIo; +import static org.shedlang.compiler.util.processes.ProcessRunner.runInheritIo; public class WasmBackend implements Backend { public static final WasmBackend DIRECT = new WasmBackend("wasm", new CodeGen() { diff --git a/src/main/java/org/shedlang/compiler/util/processes/ProcessError.java b/src/main/java/org/shedlang/compiler/util/processes/ProcessError.java new file mode 100644 index 00000000..04d9bc47 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/util/processes/ProcessError.java @@ -0,0 +1,13 @@ +package org.shedlang.compiler.util.processes; + +import java.io.IOException; + +public class ProcessError extends IOException { + public ProcessError(String message) { + super(message); + } + + public ProcessError(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/shedlang/compiler/util/processes/ProcessExitError.java b/src/main/java/org/shedlang/compiler/util/processes/ProcessExitError.java new file mode 100644 index 00000000..078ed051 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/util/processes/ProcessExitError.java @@ -0,0 +1,7 @@ +package org.shedlang.compiler.util.processes; + +public class ProcessExitError extends ProcessError { + public ProcessExitError(int exitCode) { + super("Process exited with exit code: " + exitCode); + } +} diff --git a/src/main/java/org/shedlang/compiler/util/processes/ProcessRunner.java b/src/main/java/org/shedlang/compiler/util/processes/ProcessRunner.java new file mode 100644 index 00000000..e7d76715 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/util/processes/ProcessRunner.java @@ -0,0 +1,33 @@ +package org.shedlang.compiler.util.processes; + +import java.io.IOException; +import java.util.List; + +public class ProcessRunner { + private ProcessRunner() { + } + + /** + * Run a process until it exits, inheriting standard IO from its parent + * process. + */ + public static void runInheritIo(List args) throws InterruptedException, ProcessError { + var process = startProcessInheritIo(args); + + var exitCode = process.waitFor(); + if (exitCode != 0) { + throw new ProcessExitError(exitCode); + } + } + + private static Process startProcessInheritIo(List args) throws ProcessError { + try { + return new ProcessBuilder(args) + .inheritIO() + .start(); + } catch (IOException error) { + throw new ProcessStartError(error); + } + } + +} diff --git a/src/main/java/org/shedlang/compiler/util/processes/ProcessStartError.java b/src/main/java/org/shedlang/compiler/util/processes/ProcessStartError.java new file mode 100644 index 00000000..0222565b --- /dev/null +++ b/src/main/java/org/shedlang/compiler/util/processes/ProcessStartError.java @@ -0,0 +1,7 @@ +package org.shedlang.compiler.util.processes; + +public class ProcessStartError extends ProcessError { + public ProcessStartError(Throwable cause) { + super("Could not start process", cause); + } +} -- cgit v1.2.3