aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-03 22:51:53 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-03 22:51:53 +0000
commit6a5b28a00b4d210ce5cb0fc3f8389d5d9eff8b52 (patch)
tree8c53668225585e7539a7a06b865c5e00a748e8c2 /src/main/java
parentbd28cf3a13da913dba4ced5ba9f1f165d787e3ba (diff)
Pass --target instead of --backend
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/Backends.java21
-rw-r--r--src/main/java/org/shedlang/compiler/cli/ShedCli.java4
-rw-r--r--src/main/java/org/shedlang/compiler/util/PCollectors.java31
3 files changed, 47 insertions, 9 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/Backends.java b/src/main/java/org/shedlang/compiler/backends/Backends.java
index dfc8925c..7f64e392 100644
--- a/src/main/java/org/shedlang/compiler/backends/Backends.java
+++ b/src/main/java/org/shedlang/compiler/backends/Backends.java
@@ -3,12 +3,27 @@ package org.shedlang.compiler.backends;
import org.pcollections.OrderedPMap;
import org.shedlang.compiler.backends.llvm.LlvmBackend;
import org.shedlang.compiler.backends.wasm.WasmBackend;
+import org.shedlang.compiler.util.PCollectors;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
public class Backends {
private Backends() {
}
- public static final OrderedPMap<String, Backend> BACKENDS = OrderedPMap.<String, Backend>empty()
- .plus("llvm", LlvmBackend.INSTANCE)
- .plus("wasm", WasmBackend.INSTANCE);
+ private static final OrderedPMap<String, Backend> BACKENDS =
+ Stream.of(LlvmBackend.INSTANCE, WasmBackend.INSTANCE)
+ .map(backend -> Map.entry(backend.targetName(), backend))
+ .collect(PCollectors.toOrderedPMap());
+
+ public static Set<String> targetNames() {
+ return BACKENDS.keySet();
+ }
+
+ public static Backend backendForTarget(String targetName) {
+ return BACKENDS.get(targetName);
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/cli/ShedCli.java b/src/main/java/org/shedlang/compiler/cli/ShedCli.java
index bdbbfb39..abe457c3 100644
--- a/src/main/java/org/shedlang/compiler/cli/ShedCli.java
+++ b/src/main/java/org/shedlang/compiler/cli/ShedCli.java
@@ -31,7 +31,7 @@ public class ShedCli {
switch (args.<Command>get("command")) {
case COMPILE -> {
- compiler.compile(sourcePath, Backends.BACKENDS.get(args.getString("backend")));
+ compiler.compile(sourcePath, Backends.backendForTarget(args.getString("target")));
}
case GENERATE_INSTRUCTIONS -> {
compiler.compile(sourcePath, new GenerateInstructionsBackend());
@@ -51,7 +51,7 @@ public class ShedCli {
var compileSubParser = subparsers.addParser("compile");
compileSubParser.setDefault("command", Command.COMPILE);
compileSubParser.addArgument("source").required(true);
- compileSubParser.addArgument("--backend").choices(Backends.BACKENDS.keySet()).required(true);
+ compileSubParser.addArgument("--target").choices(Backends.targetNames()).required(true);
var generateInstructionsSubParser = subparsers.addParser("generate-instructions");
generateInstructionsSubParser.setDefault("command", Command.GENERATE_INSTRUCTIONS);
diff --git a/src/main/java/org/shedlang/compiler/util/PCollectors.java b/src/main/java/org/shedlang/compiler/util/PCollectors.java
index 28e1fb28..192253bd 100644
--- a/src/main/java/org/shedlang/compiler/util/PCollectors.java
+++ b/src/main/java/org/shedlang/compiler/util/PCollectors.java
@@ -1,9 +1,6 @@
package org.shedlang.compiler.util;
-import org.pcollections.Empty;
-import org.pcollections.OrderedPSet;
-import org.pcollections.PMap;
-import org.pcollections.PVector;
+import org.pcollections.*;
import java.util.Map;
import java.util.stream.Collector;
@@ -64,6 +61,32 @@ public class PCollectors {
}
}
+ public static <K, V> Collector<Map.Entry<K, V>, OrderedPMapCollector<K, V>, OrderedPMap<K, V>> toOrderedPMap() {
+ return Collector.of(
+ OrderedPMapCollector::new,
+ OrderedPMapCollector::add,
+ OrderedPMapCollector::addAll,
+ OrderedPMapCollector::toOrderedMap
+ );
+ }
+
+ private static class OrderedPMapCollector<K, V> {
+ private OrderedPMap<K, V> map = OrderedPMap.empty();
+
+ void add(Map.Entry<K, V> entry) {
+ map = map.plus(entry.getKey(), entry.getValue());
+ }
+
+ OrderedPMapCollector<K, V> addAll(OrderedPMapCollector<K, V> other) {
+ map = map.plusAll(other.map);
+ return this;
+ }
+
+ OrderedPMap<K, V> toOrderedMap() {
+ return map;
+ }
+ }
+
public static <T> Collector<T, OrderedPSetCollector<T>, OrderedPSet<T>> toOrderedSet() {
return Collector.of(
OrderedPSetCollector::new,