diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-16 15:02:13 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-16 15:03:50 +0100 |
| commit | d2d6019cabed6e04a04bef402442697f9c32df11 (patch) | |
| tree | 17c8361fd66d9150466533b9b7db079ad16a0c8c /src/main/java | |
| parent | dbc6a12eb0d5c746f44698d5d9fd6d88d4e0bd14 (diff) | |
Create separate error when processes fail
Diffstat (limited to 'src/main/java')
8 files changed, 63 insertions, 29 deletions
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<String> 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<String> args) throws InterruptedException, ProcessError { + var process = startProcessInheritIo(args); + + var exitCode = process.waitFor(); + if (exitCode != 0) { + throw new ProcessExitError(exitCode); + } + } + + private static Process startProcessInheritIo(List<String> 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); + } +} |
