diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-08-29 10:59:06 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-08-29 10:59:06 +0100 |
| commit | 503786f64f2af7725b1b58408396000ede4b3cb4 (patch) | |
| tree | 93fcad95d1bfa1a9be78d78c9e6f32b41a7bb2ca /src | |
| parent | 2b887718befc50679896368ae6852335ffff49a6 (diff) | |
Introduce GeneratorDefinition interface
Diffstat (limited to 'src')
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; } |
