diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-11 20:51:37 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-11 20:51:37 +0100 |
| commit | 67ddc893da418073e78109d69726e2fe188e01db (patch) | |
| tree | 987759defd1a7e80324d9e1d8a39840c668b3fc0 /src | |
| parent | a4e10ae33398e1eeffae0c196379a9df1d17e34f (diff) | |
Separate targets from backends
Diffstat (limited to 'src')
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 { |
