diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-03 22:51:53 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-03 22:51:53 +0000 |
| commit | 6a5b28a00b4d210ce5cb0fc3f8389d5d9eff8b52 (patch) | |
| tree | 8c53668225585e7539a7a06b865c5e00a748e8c2 /src/main/java | |
| parent | bd28cf3a13da913dba4ced5ba9f1f165d787e3ba (diff) | |
Pass --target instead of --backend
Diffstat (limited to 'src/main/java')
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, |
