aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/shedlang/compiler/backends/BackendFactory.java7
-rw-r--r--src/main/java/org/shedlang/compiler/backends/Backends.java47
-rw-r--r--src/main/java/org/shedlang/compiler/backends/PatioNativeCHeadersBackend.java9
-rw-r--r--src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java9
-rw-r--r--src/main/java/org/shedlang/compiler/backends/ShedTarget.java41
-rw-r--r--src/main/java/org/shedlang/compiler/backends/ShidTextBackend.java9
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackendFactory.java20
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmBackendFactory.java20
-rw-r--r--src/main/java/org/shedlang/compiler/cli/ShedCli.java1
9 files changed, 139 insertions, 24 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/BackendFactory.java b/src/main/java/org/shedlang/compiler/backends/BackendFactory.java
new file mode 100644
index 00000000..b8fcdb46
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/BackendFactory.java
@@ -0,0 +1,7 @@
+package org.shedlang.compiler.backends;
+
+import java.util.Optional;
+
+public interface BackendFactory {
+ Optional<Backend> backendForTarget(ShedTarget target);
+}
diff --git a/src/main/java/org/shedlang/compiler/backends/Backends.java b/src/main/java/org/shedlang/compiler/backends/Backends.java
index 0be1ecb2..d266302f 100644
--- a/src/main/java/org/shedlang/compiler/backends/Backends.java
+++ b/src/main/java/org/shedlang/compiler/backends/Backends.java
@@ -1,36 +1,37 @@
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 org.shedlang.compiler.backends.llvm.LlvmBackendFactory;
+import org.shedlang.compiler.backends.wasm.WasmBackendFactory;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Stream;
+import java.util.List;
public class Backends {
private Backends() {
}
- private static final OrderedPMap<String, Backend> BACKENDS =
- Stream.of(
- LlvmBackend.AMD64,
- LlvmBackend.I686,
- PatioNativeCHeadersBackend.INSTANCE,
- PatioTextBackend.INSTANCE,
- ShidTextBackend.INSTANCE,
- WasmBackend.WASM32,
- WasmBackend.WASM64
- )
- .map(backend -> Map.entry(backend.targetName(), backend))
- .collect(PCollectors.toOrderedPMap());
-
- public static Set<String> targetNames() {
- return BACKENDS.keySet();
+ private static final List<BackendFactory> BACKEND_FACTORIES = List.of(
+ new LlvmBackendFactory(),
+ new WasmBackendFactory(),
+ PatioNativeCHeadersBackend.FACTORY,
+ PatioTextBackend.FACTORY,
+ ShidTextBackend.FACTORY
+ );
+
+ public static List<String> targetNames() {
+ return ShedTarget.targetNames();
}
public static Backend backendForTarget(String targetName) {
- return BACKENDS.get(targetName);
+ var target = ShedTarget.fromString(targetName)
+ .orElseThrow(() -> new UnsupportedOperationException("TODO"));
+
+ for (var factory : BACKEND_FACTORIES) {
+ var backend = factory.backendForTarget(target);
+ if (backend.isPresent()) {
+ return backend.get();
+ }
+ }
+
+ throw new UnsupportedOperationException("TODO");
}
}
diff --git a/src/main/java/org/shedlang/compiler/backends/PatioNativeCHeadersBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioNativeCHeadersBackend.java
index 4f15c33d..ea8bde7c 100644
--- a/src/main/java/org/shedlang/compiler/backends/PatioNativeCHeadersBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/PatioNativeCHeadersBackend.java
@@ -13,8 +13,17 @@ import org.shedlang.compiler.types.NamespaceName;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
+import java.util.Optional;
public class PatioNativeCHeadersBackend implements Backend {
+ public static final BackendFactory FACTORY = target -> {
+ if (target == ShedTarget.PATIO_NATIVE_C_HEADERS) {
+ return Optional.of(PatioNativeCHeadersBackend.INSTANCE);
+ } else {
+ return Optional.empty();
+ }
+ };
+
public static final PatioNativeCHeadersBackend INSTANCE = new PatioNativeCHeadersBackend();
private PatioNativeCHeadersBackend() {
diff --git a/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java
index 052408c0..c2fe8708 100644
--- a/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java
@@ -13,8 +13,17 @@ import org.shedlang.compiler.types.NamespaceName;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
+import java.util.Optional;
public class PatioTextBackend implements Backend {
+ public static final BackendFactory FACTORY = target -> {
+ if (target == ShedTarget.PATIO_TEXT) {
+ return Optional.of(PatioTextBackend.INSTANCE);
+ } else {
+ return Optional.empty();
+ }
+ };
+
public static final PatioTextBackend INSTANCE = new PatioTextBackend();
private PatioTextBackend() {
diff --git a/src/main/java/org/shedlang/compiler/backends/ShedTarget.java b/src/main/java/org/shedlang/compiler/backends/ShedTarget.java
new file mode 100644
index 00000000..d99de131
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/ShedTarget.java
@@ -0,0 +1,41 @@
+package org.shedlang.compiler.backends;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+public enum ShedTarget {
+ AMD64("amd64"),
+ I686("i686"),
+ WASM32("wasm32"),
+ WASM64("wasm64"),
+ PATIO_NATIVE_C_HEADERS("patio-native-c-headers"),
+ PATIO_TEXT("patio-text"),
+ SHID_TEXT("shid-text");
+
+ public static List<String> targetNames() {
+ return Arrays.stream(ShedTarget.class.getEnumConstants())
+ .map(ShedTarget::targetName)
+ .toList();
+ }
+
+ public static Optional<ShedTarget> fromString(String targetName) {
+ for (var target : ShedTarget.class.getEnumConstants()) {
+ if (target.targetName.equals(targetName)) {
+ return Optional.of(target);
+ }
+ }
+
+ return Optional.empty();
+ }
+
+ private final String targetName;
+
+ ShedTarget(String targetName) {
+ this.targetName = targetName;
+ }
+
+ public String targetName() {
+ return targetName;
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/backends/ShidTextBackend.java b/src/main/java/org/shedlang/compiler/backends/ShidTextBackend.java
index f34c18b2..7468336f 100644
--- a/src/main/java/org/shedlang/compiler/backends/ShidTextBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/ShidTextBackend.java
@@ -10,8 +10,17 @@ import org.shedlang.compiler.typechecker.TypeInfos;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
+import java.util.Optional;
public class ShidTextBackend implements Backend {
+ public static final BackendFactory FACTORY = target -> {
+ if (target == ShedTarget.SHID_TEXT) {
+ return Optional.of(ShidTextBackend.INSTANCE);
+ } else {
+ return Optional.empty();
+ }
+ };
+
public static final ShidTextBackend INSTANCE = new ShidTextBackend();
private ShidTextBackend() {
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackendFactory.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackendFactory.java
new file mode 100644
index 00000000..bb8a952a
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackendFactory.java
@@ -0,0 +1,20 @@
+package org.shedlang.compiler.backends.llvm;
+
+import org.shedlang.compiler.backends.Backend;
+import org.shedlang.compiler.backends.BackendFactory;
+import org.shedlang.compiler.backends.ShedTarget;
+
+import java.util.Optional;
+
+public class LlvmBackendFactory implements BackendFactory {
+ @Override
+ public Optional<Backend> backendForTarget(ShedTarget target) {
+ Optional<LlvmTarget> llvmTarget = switch (target) {
+ case AMD64 -> Optional.of(LlvmTarget.AMD64);
+ case I686 -> Optional.of(LlvmTarget.I686);
+ default -> Optional.empty();
+ };
+
+ return llvmTarget.map(LlvmBackend::forTarget);
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackendFactory.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackendFactory.java
new file mode 100644
index 00000000..5cf8446f
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackendFactory.java
@@ -0,0 +1,20 @@
+package org.shedlang.compiler.backends.wasm;
+
+import org.shedlang.compiler.backends.Backend;
+import org.shedlang.compiler.backends.BackendFactory;
+import org.shedlang.compiler.backends.ShedTarget;
+
+import java.util.Optional;
+
+public class WasmBackendFactory implements BackendFactory {
+ @Override
+ public Optional<Backend> backendForTarget(ShedTarget target) {
+ Optional<WasmTarget> wasmTarget = switch (target) {
+ case WASM32 -> Optional.of(WasmTarget.WASM32);
+ case WASM64 -> Optional.of(WasmTarget.WASM64);
+ default -> Optional.empty();
+ };
+
+ return wasmTarget.map(WasmBackend::forTarget);
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/cli/ShedCli.java b/src/main/java/org/shedlang/compiler/cli/ShedCli.java
index c311e7bd..46bf9b5f 100644
--- a/src/main/java/org/shedlang/compiler/cli/ShedCli.java
+++ b/src/main/java/org/shedlang/compiler/cli/ShedCli.java
@@ -10,7 +10,6 @@ import org.shedlang.compiler.errors.CompilerError;
import java.io.IOException;
import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.Optional;
public class ShedCli {