From 6a5b28a00b4d210ce5cb0fc3f8389d5d9eff8b52 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 3 Dec 2023 22:51:53 +0000 Subject: Pass --target instead of --backend --- .../org/shedlang/compiler/backends/Backends.java | 21 ++++++++++++--- .../java/org/shedlang/compiler/cli/ShedCli.java | 4 +-- .../org/shedlang/compiler/util/PCollectors.java | 31 +++++++++++++++++++--- 3 files changed, 47 insertions(+), 9 deletions(-) (limited to 'src/main/java') 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 BACKENDS = OrderedPMap.empty() - .plus("llvm", LlvmBackend.INSTANCE) - .plus("wasm", WasmBackend.INSTANCE); + private static final OrderedPMap BACKENDS = + Stream.of(LlvmBackend.INSTANCE, WasmBackend.INSTANCE) + .map(backend -> Map.entry(backend.targetName(), backend)) + .collect(PCollectors.toOrderedPMap()); + + public static Set 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.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 Collector, OrderedPMapCollector, OrderedPMap> toOrderedPMap() { + return Collector.of( + OrderedPMapCollector::new, + OrderedPMapCollector::add, + OrderedPMapCollector::addAll, + OrderedPMapCollector::toOrderedMap + ); + } + + private static class OrderedPMapCollector { + private OrderedPMap map = OrderedPMap.empty(); + + void add(Map.Entry entry) { + map = map.plus(entry.getKey(), entry.getValue()); + } + + OrderedPMapCollector addAll(OrderedPMapCollector other) { + map = map.plusAll(other.map); + return this; + } + + OrderedPMap toOrderedMap() { + return map; + } + } + public static Collector, OrderedPSet> toOrderedSet() { return Collector.of( OrderedPSetCollector::new, -- cgit v1.2.3