summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-29 10:59:06 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-29 10:59:06 +0100
commit503786f64f2af7725b1b58408396000ede4b3cb4 (patch)
tree93fcad95d1bfa1a9be78d78c9e6f32b41a7bb2ca /src
parent2b887718befc50679896368ae6852335ffff49a6 (diff)
Introduce GeneratorDefinition interface
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java37
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/GeneratorDefinition.java15
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/Generators.java33
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java27
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java27
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java24
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java25
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java25
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java27
9 files changed, 194 insertions, 46 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java
index 9af101e..0e6133c 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java
@@ -1,13 +1,8 @@
package org.zwobble.hobgoblin.compiler.config;
import org.zwobble.hobgoblin.compiler.output.generators.Generator;
+import org.zwobble.hobgoblin.compiler.output.generators.Generators;
import org.zwobble.hobgoblin.compiler.output.generators.errors.UnknownGeneratorError;
-import org.zwobble.hobgoblin.compiler.output.generators.javapreciselymatchers.JavaPreciselyMatchersGenerator;
-import org.zwobble.hobgoblin.compiler.output.generators.javatransient0.JavaTransient0Generator;
-import org.zwobble.hobgoblin.compiler.output.generators.javatypes.JavaTypesGenerator;
-import org.zwobble.hobgoblin.compiler.output.generators.rusttransient0.RustTransient0Generator;
-import org.zwobble.hobgoblin.compiler.output.generators.rusttypes.RustTypesGenerator;
-import org.zwobble.hobgoblin.compiler.output.generators.typescripttypes.TypescriptTypesGenerator;
import org.zwobble.hobgoblin.compiler.sources.FileFragmentSource;
import org.zwobble.json5.reader.Json5ObjectReader;
import org.zwobble.sourcetext.SourceText;
@@ -41,31 +36,13 @@ public record ProjectConfig(
for (var generatorJson : generatorsJson) {
var generatorName = generatorJson.getString("generator");
- var output = switch (generatorName.value()) {
- case JavaTypesGenerator.NAME ->
- JavaTypesGenerator.parseGeneratorConfig(projectRoot, generatorJson, langsJson);
+ var definition = Generators.definition(generatorName.value())
+ .orElseThrow(() -> new UnknownGeneratorError(
+ generatorName.value(),
+ new FileFragmentSource(generatorName.sourceRange())
+ ));
- case JavaPreciselyMatchersGenerator.NAME ->
- JavaPreciselyMatchersGenerator.parseGeneratorConfig(projectRoot, generatorJson, langsJson);
-
- case JavaTransient0Generator.NAME ->
- JavaTransient0Generator.parseGeneratorConfig(projectRoot, generatorJson, langsJson);
-
- case RustTypesGenerator.NAME ->
- RustTypesGenerator.parseGeneratorConfig(projectRoot, generatorJson, langsJson);
-
- case RustTransient0Generator.NAME ->
- RustTransient0Generator.parseGeneratorConfig(projectRoot, generatorJson, langsJson);
-
- case TypescriptTypesGenerator.NAME ->
- TypescriptTypesGenerator.parseGeneratorConfig(projectRoot, generatorJson, langsJson);
-
- default ->
- throw new UnknownGeneratorError(
- generatorName.value(),
- new FileFragmentSource(generatorName.sourceRange())
- );
- };
+ var output = definition.parseGeneratorConfig(projectRoot, generatorJson, langsJson);
outputs.add(output);
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/GeneratorDefinition.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/GeneratorDefinition.java
new file mode 100644
index 0000000..459050f
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/GeneratorDefinition.java
@@ -0,0 +1,15 @@
+package org.zwobble.hobgoblin.compiler.output.generators;
+
+import org.zwobble.hobgoblin.compiler.config.OutputConfig;
+import org.zwobble.json5.reader.Json5ObjectReader;
+
+import java.nio.file.Path;
+
+public interface GeneratorDefinition {
+ String name();
+ OutputConfig parseGeneratorConfig(
+ Path projectRoot,
+ Json5ObjectReader generatorJson,
+ Json5ObjectReader langsJson
+ );
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/Generators.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/Generators.java
new file mode 100644
index 0000000..92b78b8
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/Generators.java
@@ -0,0 +1,33 @@
+package org.zwobble.hobgoblin.compiler.output.generators;
+
+import org.zwobble.hobgoblin.compiler.output.generators.javapreciselymatchers.JavaPreciselyMatchersGenerator;
+import org.zwobble.hobgoblin.compiler.output.generators.javatransient0.JavaTransient0Generator;
+import org.zwobble.hobgoblin.compiler.output.generators.javatypes.JavaTypesGenerator;
+import org.zwobble.hobgoblin.compiler.output.generators.rusttransient0.RustTransient0Generator;
+import org.zwobble.hobgoblin.compiler.output.generators.rusttypes.RustTypesGenerator;
+import org.zwobble.hobgoblin.compiler.output.generators.typescripttypes.TypescriptTypesGenerator;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+public class Generators {
+ private Generators() {}
+
+ private static final List<GeneratorDefinition> DEFINITIONS = List.of(
+ JavaTypesGenerator.DEFINITION,
+ JavaPreciselyMatchersGenerator.DEFINITION,
+ JavaTransient0Generator.DEFINITION,
+ RustTypesGenerator.DEFINITION,
+ RustTransient0Generator.DEFINITION,
+ TypescriptTypesGenerator.DEFINITION
+ );
+
+ private static final Map<String, GeneratorDefinition> DEFINITIONS_BY_NAME = DEFINITIONS.stream()
+ .collect(Collectors.toMap(GeneratorDefinition::name, definition -> definition));
+
+ public static Optional<GeneratorDefinition> definition(String name) {
+ return Optional.ofNullable(DEFINITIONS_BY_NAME.get(name));
+ }
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java
index 2950006..6155a81 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java
@@ -4,6 +4,7 @@ import org.zwobble.hobgoblin.compiler.ast.DocComment;
import org.zwobble.hobgoblin.compiler.ast.typed.*;
import org.zwobble.hobgoblin.compiler.config.OutputConfig;
import org.zwobble.hobgoblin.compiler.output.generators.Generator;
+import org.zwobble.hobgoblin.compiler.output.generators.GeneratorDefinition;
import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGenerator;
import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGeneratorConfig;
import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*;
@@ -21,9 +22,29 @@ import java.util.Set;
import static org.zwobble.hobgoblin.compiler.util.Casing.lowerCamelCaseToUpperCamelCase;
public class JavaPreciselyMatchersGenerator implements Generator {
- public static final String NAME = "java-precisely-matchers";
+ private static final String NAME = "java-precisely-matchers";
- public static OutputConfig parseGeneratorConfig(
+ public static final GeneratorDefinition DEFINITION = new GeneratorDefinition() {
+ @Override
+ public String name() {
+ return NAME;
+ }
+
+ @Override
+ public OutputConfig parseGeneratorConfig(
+ Path projectRoot,
+ Json5ObjectReader generatorJson,
+ Json5ObjectReader langsJson
+ ) {
+ return JavaPreciselyMatchersGenerator.parseGeneratorConfig(
+ projectRoot,
+ generatorJson,
+ langsJson
+ );
+ }
+ };
+
+ private static OutputConfig parseGeneratorConfig(
Path projectRoot,
Json5ObjectReader generatorJson,
Json5ObjectReader langsJson
@@ -43,7 +64,7 @@ public class JavaPreciselyMatchersGenerator implements Generator {
private final Path sourceRootDirectory;
private final JavaGenerator javaGenerator;
- public JavaPreciselyMatchersGenerator(Path sourceRootDirectory, JavaGenerator javaGenerator) {
+ private JavaPreciselyMatchersGenerator(Path sourceRootDirectory, JavaGenerator javaGenerator) {
this.sourceRootDirectory = sourceRootDirectory;
this.javaGenerator = javaGenerator;
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java
index 4197a24..42a4a6a 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java
@@ -5,6 +5,7 @@ import org.zwobble.hobgoblin.compiler.ast.typed.*;
import org.zwobble.hobgoblin.compiler.builtins.NativeTypes;
import org.zwobble.hobgoblin.compiler.config.OutputConfig;
import org.zwobble.hobgoblin.compiler.output.generators.Generator;
+import org.zwobble.hobgoblin.compiler.output.generators.GeneratorDefinition;
import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGenerator;
import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGeneratorConfig;
import org.zwobble.hobgoblin.compiler.output.generators.transient0.Transient0TypeLevelValuesUnsupported;
@@ -23,7 +24,27 @@ import java.util.stream.IntStream;
import java.util.stream.Stream;
public class JavaTransient0Generator implements Generator {
- public static final String NAME = "java-transient-0";
+ private static final String NAME = "java-transient-0";
+
+ public static final GeneratorDefinition DEFINITION = new GeneratorDefinition() {
+ @Override
+ public String name() {
+ return NAME;
+ }
+
+ @Override
+ public OutputConfig parseGeneratorConfig(
+ Path projectRoot,
+ Json5ObjectReader generatorJson,
+ Json5ObjectReader langsJson
+ ) {
+ return JavaTransient0Generator.parseGeneratorConfig(
+ projectRoot,
+ generatorJson,
+ langsJson
+ );
+ }
+ };
private static final JavaIdentifier VALUE_NAME = JavaIdentifier.of("value");
private static final JavaIdentifier OUTPUT_STREAM_NAME = JavaIdentifier.of("outputStream");
@@ -32,7 +53,7 @@ public class JavaTransient0Generator implements Generator {
private static final JavaIdentifier ENCODER_ENCODE_METHOD_NAME = JavaIdentifier.of("encode");
private static final JavaIdentifier DECODE_DECODE_METHOD_NAME = JavaIdentifier.of("decode");
- public static OutputConfig parseGeneratorConfig(
+ private static OutputConfig parseGeneratorConfig(
Path projectRoot,
Json5ObjectReader generatorJson,
Json5ObjectReader langsJson
@@ -53,7 +74,7 @@ public class JavaTransient0Generator implements Generator {
private final JavaGenerator javaGenerator;
private final Map<Type, Long> typeIds;
- public JavaTransient0Generator(Path sourceRootDirectory, JavaGenerator javaGenerator) {
+ private JavaTransient0Generator(Path sourceRootDirectory, JavaGenerator javaGenerator) {
this.sourceRootDirectory = sourceRootDirectory;
this.javaGenerator = javaGenerator;
this.typeIds = new HashMap<>();
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java
index 814fe4b..1112b67 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java
@@ -6,6 +6,7 @@ import org.zwobble.hobgoblin.compiler.ast.typed.*;
import org.zwobble.hobgoblin.compiler.builtins.NativeTypes;
import org.zwobble.hobgoblin.compiler.config.OutputConfig;
import org.zwobble.hobgoblin.compiler.output.generators.Generator;
+import org.zwobble.hobgoblin.compiler.output.generators.GeneratorDefinition;
import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGenerator;
import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGeneratorConfig;
import org.zwobble.hobgoblin.compiler.output.generators.java.JavaNativeTypeConfig;
@@ -25,12 +26,29 @@ import java.util.Optional;
import static org.zwobble.hobgoblin.compiler.util.Casing.lowerCamelCaseToUpperCamelCase;
public class JavaTypesGenerator implements Generator {
- public static final String NAME = "java-types";
+ private static final String NAME = "java-types";
+
+ public static final GeneratorDefinition DEFINITION = new GeneratorDefinition() {
+ @Override
+ public String name() {
+ return NAME;
+ }
+
+ @Override
+ public OutputConfig parseGeneratorConfig(
+ Path projectRoot,
+ Json5ObjectReader generatorJson,
+ Json5ObjectReader langsJson
+ ) {
+ return JavaTypesGenerator.parseGeneratorConfig(projectRoot, generatorJson, langsJson);
+ };
+ };
+
private static final JavaIdentifier ARBITRARY_METHOD_NAME = JavaIdentifier.of("arbitrary");
private static final JavaIdentifier BUILDER_TYPE_NAME = JavaIdentifier.of("Builder");
private static final JavaIdentifier BUILD_METHOD_NAME = JavaIdentifier.of("build");
- public static OutputConfig parseGeneratorConfig(
+ private static OutputConfig parseGeneratorConfig(
Path projectRoot,
Json5ObjectReader generatorJson,
Json5ObjectReader langsJson
@@ -51,7 +69,7 @@ public class JavaTypesGenerator implements Generator {
private final JavaGeneratorConfig javaGeneratorConfig;
private final JavaGenerator javaGenerator;
- public JavaTypesGenerator(
+ private JavaTypesGenerator(
Path sourceRootDirectory,
JavaGeneratorConfig javaGeneratorConfig,
JavaGenerator javaGenerator
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java
index 46e0a5c..1dc246f 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java
@@ -4,6 +4,7 @@ import org.zwobble.hobgoblin.compiler.ast.typed.*;
import org.zwobble.hobgoblin.compiler.builtins.NativeTypes;
import org.zwobble.hobgoblin.compiler.config.OutputConfig;
import org.zwobble.hobgoblin.compiler.output.generators.Generator;
+import org.zwobble.hobgoblin.compiler.output.generators.GeneratorDefinition;
import org.zwobble.hobgoblin.compiler.output.generators.rust.RustGenerator;
import org.zwobble.hobgoblin.compiler.output.generators.rust.RustGeneratorConfig;
import org.zwobble.hobgoblin.compiler.output.generators.transient0.Transient0TypeLevelValuesUnsupported;
@@ -26,7 +27,27 @@ import java.util.stream.Stream;
import static org.zwobble.hobgoblin.compiler.util.ListCollectors.toArrayList;
public class RustTransient0Generator implements Generator {
- public static final String NAME = "rust-transient-0";
+ private static final String NAME = "rust-transient-0";
+
+ public static final GeneratorDefinition DEFINITION = new GeneratorDefinition() {
+ @Override
+ public String name() {
+ return NAME;
+ }
+
+ @Override
+ public OutputConfig parseGeneratorConfig(
+ Path projectRoot,
+ Json5ObjectReader generatorJson,
+ Json5ObjectReader langsJson
+ ) {
+ return RustTransient0Generator.parseGeneratorConfig(
+ projectRoot,
+ generatorJson,
+ langsJson
+ );
+ }
+ };
private static final RustIdentifier VALUE_NAME = RustIdentifier.of("value");
private static final RustIdentifier READER_NAME = RustIdentifier.of("reader");
@@ -35,7 +56,7 @@ public class RustTransient0Generator implements Generator {
private static final RustIdentifier ENCODE_TYPE_NAME = RustIdentifier.of("Encode");
private static final RustIdentifier DECODE_TYPE_NAME = RustIdentifier.of("Decode");
- public static OutputConfig parseGeneratorConfig(
+ private static OutputConfig parseGeneratorConfig(
Path projectRoot,
Json5ObjectReader output,
Json5ObjectReader langsJson
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java
index 4df01d1..d5bc46a 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java
@@ -3,6 +3,7 @@ package org.zwobble.hobgoblin.compiler.output.generators.rusttypes;
import org.zwobble.hobgoblin.compiler.ast.typed.*;
import org.zwobble.hobgoblin.compiler.config.OutputConfig;
import org.zwobble.hobgoblin.compiler.output.generators.Generator;
+import org.zwobble.hobgoblin.compiler.output.generators.GeneratorDefinition;
import org.zwobble.hobgoblin.compiler.output.generators.rust.RustGenerator;
import org.zwobble.hobgoblin.compiler.output.generators.rust.RustGeneratorConfig;
import org.zwobble.hobgoblin.compiler.output.lang.rust.ast.*;
@@ -19,9 +20,29 @@ import java.util.List;
import java.util.Optional;
public class RustTypesGenerator implements Generator {
- public static final String NAME = "rust-types";
+ private static final String NAME = "rust-types";
- public static OutputConfig parseGeneratorConfig(
+ public static final GeneratorDefinition DEFINITION = new GeneratorDefinition() {
+ @Override
+ public String name() {
+ return NAME;
+ }
+
+ @Override
+ public OutputConfig parseGeneratorConfig(
+ Path projectRoot,
+ Json5ObjectReader generatorJson,
+ Json5ObjectReader langsJson
+ ) {
+ return RustTypesGenerator.parseGeneratorConfig(
+ projectRoot,
+ generatorJson,
+ langsJson
+ );
+ }
+ };
+
+ private static OutputConfig parseGeneratorConfig(
Path projectRoot,
Json5ObjectReader output,
Json5ObjectReader langsJson
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java
index 04278ea..1d190a5 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java
@@ -3,6 +3,7 @@ package org.zwobble.hobgoblin.compiler.output.generators.typescripttypes;
import org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceNode;
import org.zwobble.hobgoblin.compiler.config.OutputConfig;
import org.zwobble.hobgoblin.compiler.output.generators.Generator;
+import org.zwobble.hobgoblin.compiler.output.generators.GeneratorDefinition;
import org.zwobble.hobgoblin.compiler.output.generators.typescript.TypescriptGenerator;
import org.zwobble.hobgoblin.compiler.output.generators.typescript.TypescriptGeneratorConfig;
import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo;
@@ -13,9 +14,29 @@ import java.nio.file.Path;
import java.util.List;
public class TypescriptTypesGenerator implements Generator {
- public static final String NAME = "typescript-types";
+ private static final String NAME = "typescript-types";
- public static OutputConfig parseGeneratorConfig(
+ public static final GeneratorDefinition DEFINITION = new GeneratorDefinition() {
+ @Override
+ public String name() {
+ return NAME;
+ }
+
+ @Override
+ public OutputConfig parseGeneratorConfig(
+ Path projectRoot,
+ Json5ObjectReader generatorJson,
+ Json5ObjectReader langsJson
+ ) {
+ return TypescriptTypesGenerator.parseGeneratorConfig(
+ projectRoot,
+ generatorJson,
+ langsJson
+ );
+ }
+ };
+
+ private static OutputConfig parseGeneratorConfig(
Path projectRoot,
Json5ObjectReader generatorJson,
Json5ObjectReader langsJson
@@ -35,7 +56,7 @@ public class TypescriptTypesGenerator implements Generator {
private final Path outputPath;
private final TypescriptGenerator typescriptGenerator;
- public TypescriptTypesGenerator(Path outputPath, TypescriptGenerator typescriptGenerator) {
+ private TypescriptTypesGenerator(Path outputPath, TypescriptGenerator typescriptGenerator) {
this.outputPath = outputPath;
this.typescriptGenerator = typescriptGenerator;
}