aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-18 12:15:46 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-18 12:15:46 +0100
commit9e08a99b327c7d704f533e3535b77a1bbdc04919 (patch)
treebe0fc9ced28cfec9f14b315e80f5c5fb7d6d45c5 /src/main/java
parent0272455c8bb06d5c63220172b2888510aeb7f40b (diff)
Run examples automatically
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java28
-rw-r--r--src/main/java/org/shedlang/compiler/config/BinConfig.java11
-rw-r--r--src/main/java/org/shedlang/compiler/config/ExampleConfig.java12
-rw-r--r--src/main/java/org/shedlang/compiler/config/ProjectConfig.java18
-rw-r--r--src/main/java/org/shedlang/compiler/filesystem/ShedCompilerFiles.java13
5 files changed, 69 insertions, 13 deletions
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 c2cf941d..c1ff0c95 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
@@ -4,6 +4,7 @@ import org.shedlang.compiler.backends.Backend;
import org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializer;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmModule;
import org.shedlang.compiler.config.ProjectConfig;
+import org.shedlang.compiler.filesystem.ShedCompilerFiles;
import org.shedlang.compiler.stackir.instructions.Instruction;
import org.shedlang.compiler.typechecker.TypeInfo;
import org.shedlang.compiler.types.NamespaceName;
@@ -36,24 +37,25 @@ public class LlvmBackend implements Backend {
objectFilePaths.add(objectPath);
}
- var mainModule = LlvmCompiler.compileMain(config.main(), typeInfo);
- var objectPath = compileLlvmModule(mainModule, config.targetDir(), "main");
- objectFilePaths.add(objectPath);
+ for (var bin : config.bins()) {
+ var mainModule = LlvmCompiler.compileMain(config.main(), typeInfo);
+ var objectPath = compileLlvmModule(mainModule, config.targetDir().resolve("bins"), bin.name());
+ objectFilePaths.add(objectPath);
- var gccArgs = new ArrayList<String>();
- gccArgs.add("gcc");
+ var gccArgs = new ArrayList<String>();
+ gccArgs.add("gcc");
- gccArgs.add("-o");
- gccArgs.add(config.targetDir().resolve("main").toString());
+ gccArgs.add("-o");
+ gccArgs.add(config.targetDir().resolve(bin.name()).toString());
- for (var objectFilePath : objectFilePaths) {
- gccArgs.add(objectFilePath.toString());
- }
+ for (var objectFilePath : objectFilePaths) {
+ gccArgs.add(objectFilePath.toString());
+ }
- // TODO: don't assume we're in the project root
- gccArgs.add("runtime/build/libshed.a");
+ gccArgs.add(ShedCompilerFiles.getRoot().resolve("runtime/build/libshed.a").toString());
- run(gccArgs);
+ run(gccArgs);
+ }
}
private static Path compileLlvmModule(
diff --git a/src/main/java/org/shedlang/compiler/config/BinConfig.java b/src/main/java/org/shedlang/compiler/config/BinConfig.java
new file mode 100644
index 00000000..c3e70f2d
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/config/BinConfig.java
@@ -0,0 +1,11 @@
+package org.shedlang.compiler.config;
+
+import org.tomlj.TomlTable;
+
+public record BinConfig(String name) {
+ public static BinConfig fromToml(TomlTable table) {
+ var name = table.getString("name");
+
+ return new BinConfig(name);
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/config/ExampleConfig.java b/src/main/java/org/shedlang/compiler/config/ExampleConfig.java
new file mode 100644
index 00000000..46ca462d
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/config/ExampleConfig.java
@@ -0,0 +1,12 @@
+package org.shedlang.compiler.config;
+
+import org.tomlj.TomlTable;
+
+public record ExampleConfig(String bin, String expectedOutput) {
+ public static ExampleConfig fromToml(TomlTable table) {
+ return new ExampleConfig(
+ table.getString("bin"),
+ table.getString("expected-output")
+ );
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java
index 1db4b87d..1d6a9a9f 100644
--- a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java
+++ b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java
@@ -7,6 +7,8 @@ import org.tomlj.TomlTable;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Arrays;
+import java.util.List;
+import java.util.stream.IntStream;
public class ProjectConfig {
public static ProjectConfig read(Path projectPath) throws IOException {
@@ -36,4 +38,20 @@ public class ProjectConfig {
public Path targetDir() {
return root.resolve("target");
}
+
+ public List<BinConfig> bins() {
+ var binsArray = config.getArray(List.of("shed", "bins"));
+
+ return IntStream.range(0, binsArray.size())
+ .mapToObj(binIndex -> BinConfig.fromToml(binsArray.getTable(binIndex)))
+ .toList();
+ }
+
+ public List<ExampleConfig> examples() {
+ var examplesArray = config.getArray(List.of("shed", "examples"));
+
+ return IntStream.range(0, examplesArray.size())
+ .mapToObj(exampleIndex -> ExampleConfig.fromToml(examplesArray.getTable(exampleIndex)))
+ .toList();
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/filesystem/ShedCompilerFiles.java b/src/main/java/org/shedlang/compiler/filesystem/ShedCompilerFiles.java
new file mode 100644
index 00000000..62e61567
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/filesystem/ShedCompilerFiles.java
@@ -0,0 +1,13 @@
+package org.shedlang.compiler.filesystem;
+
+import java.nio.file.Path;
+
+public class ShedCompilerFiles {
+ private ShedCompilerFiles() {
+ }
+
+ public static Path getRoot() {
+ // TODO: don't assume we're in the project root
+ return Path.of(".");
+ }
+}