From 74a6782f2489c8709c61d80f5b62519fa509a9b0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 12 Jun 2026 17:34:33 +0100 Subject: Extract JavaGeneratorConfig --- .../generators/java/JavaGeneratorConfig.java | 77 ++++++++++++++++++++++ .../generators/java/JavaNamespaceConfig.java | 6 ++ .../generators/java/JavaNativeTypeConfig.java | 15 +++++ .../generators/javatypes/JavaNamespaceConfig.java | 6 -- .../generators/javatypes/JavaNativeTypeConfig.java | 15 ----- .../generators/javatypes/JavaTypesGenerator.java | 72 +++----------------- 6 files changed, 108 insertions(+), 83 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNamespaceConfig.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNativeTypeConfig.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNamespaceConfig.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java (limited to 'src/main/java/org/zwobble') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java new file mode 100644 index 0000000..92fe951 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java @@ -0,0 +1,77 @@ +package org.zwobble.hobgoblin.compiler.output.generators.java; + +import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIntegerLiteral; +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaStaticMethodCall; +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaStringLiteral; +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef; +import org.zwobble.hobgoblin.compiler.parser.Parser; +import org.zwobble.hobgoblin.compiler.types.NamespaceName; +import org.zwobble.hobgoblin.compiler.types.SimpleNativeType; +import org.zwobble.json5.reader.Json5ObjectReader; + +import java.util.*; + +public record JavaGeneratorConfig( + List packageName, + Map namespaceConfigs, + Map nativeTypeConfigs +) { + public static JavaGeneratorConfig parseOutputConfig(Json5ObjectReader output) { + var packageName = output.getString("packageName").value(); + var namespaceConfigs = parseNamespaceConfigs(output); + var nativeTypeConfigs = parseNativeTypeConfigs(output); + + return new JavaGeneratorConfig( + Arrays.asList(packageName.split("\\.")), + namespaceConfigs, + nativeTypeConfigs + ); + } + + private static Map parseNamespaceConfigs(Json5ObjectReader output) { + var namespaceConfigs = new HashMap(); + output.getArrayOfObjects("namespaces").ifPresent(namespacesJson -> { + for (var namespaceJson : namespacesJson) { + var hobgoblinNamespaceString = namespaceJson.getString("hobgoblin").valueAsSourceText(); + var hobgoblinNamespace = Parser.parseNamespaceName(hobgoblinNamespaceString); + + var javaPackageString = namespaceJson.getString("java").value(); + var javaPackage = Arrays.asList(javaPackageString.split("\\.")); + + namespaceConfigs.put(hobgoblinNamespace, new JavaNamespaceConfig(javaPackage)); + } + }); + + return namespaceConfigs; + } + + private static Map parseNativeTypeConfigs(Json5ObjectReader output) { + var nativeTypeConfigs = new HashMap(DEFAULT_NATIVE_TYPE_CONFIGS); + output.getArrayOfObjects("nativeTypes").ifPresent(nativeTypesJson -> { + for (var nativeTypeJson : nativeTypesJson) { + var hobgoblinTypeString = nativeTypeJson.getString("hobgoblin").valueAsSourceText(); + var hobgoblinTypeName = Parser.parseQualifiedTypeName(hobgoblinTypeString); + var hobgoblinType = new SimpleNativeType( + hobgoblinTypeName.namespaceName(), + hobgoblinTypeName.name() + ); + + var javaTypeString = nativeTypeJson.getString("java").value(); + var javaTypeParts = Arrays.asList(javaTypeString.split("\\.")); + var javaTypeRef = JavaTypeRef.topLevel(javaTypeParts.subList(0, javaTypeParts.size() - 1), javaTypeParts.getLast()); + + nativeTypeConfigs.put(hobgoblinType, new JavaNativeTypeConfig(javaTypeRef, Optional.empty())); + } + }); + + return nativeTypeConfigs; + } + + private static final Map DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries( + Map.entry(NativeTypes.INT_32, JavaNativeTypeConfig.of(JavaTypeRef.INT, new JavaIntegerLiteral(0))), + Map.entry(NativeTypes.STRING, JavaNativeTypeConfig.of(JavaTypeRef.STRING, new JavaStringLiteral(""))), + Map.entry(NativeTypes.LIST_INNER, JavaNativeTypeConfig.of(JavaTypeRef.LIST, new JavaStaticMethodCall(JavaTypeRef.LIST, "of", List.of()))) + ); + +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNamespaceConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNamespaceConfig.java new file mode 100644 index 0000000..3c313cd --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNamespaceConfig.java @@ -0,0 +1,6 @@ +package org.zwobble.hobgoblin.compiler.output.generators.java; + +import java.util.List; + +public record JavaNamespaceConfig(List packageName) { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNativeTypeConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNativeTypeConfig.java new file mode 100644 index 0000000..54e99b2 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNativeTypeConfig.java @@ -0,0 +1,15 @@ +package org.zwobble.hobgoblin.compiler.output.generators.java; + +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression; +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef; + +import java.util.Optional; + +public record JavaNativeTypeConfig( + JavaTypeRef javaTypeRef, + Optional arbitraryValue +) { + public static JavaNativeTypeConfig of(JavaTypeRef javaTypeRef, JavaExpression arbitraryValue) { + return new JavaNativeTypeConfig(javaTypeRef, Optional.of(arbitraryValue)); + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNamespaceConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNamespaceConfig.java deleted file mode 100644 index 314875c..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNamespaceConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.zwobble.hobgoblin.compiler.output.generators.javatypes; - -import java.util.List; - -public record JavaNamespaceConfig(List packageName) { -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java deleted file mode 100644 index 7bae0f6..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.zwobble.hobgoblin.compiler.output.generators.javatypes; - -import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression; -import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef; - -import java.util.Optional; - -public record JavaNativeTypeConfig( - JavaTypeRef javaTypeRef, - Optional arbitraryValue -) { - public static JavaNativeTypeConfig of(JavaTypeRef javaTypeRef, JavaExpression arbitraryValue) { - return new JavaNativeTypeConfig(javaTypeRef, Optional.of(arbitraryValue)); - } -} 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 041f3d0..a3532be 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 @@ -2,12 +2,12 @@ package org.zwobble.hobgoblin.compiler.output.generators.javatypes; import org.zwobble.hobgoblin.compiler.ast.DocComment; 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.java.JavaGenerator; +import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGeneratorConfig; +import org.zwobble.hobgoblin.compiler.output.generators.java.JavaNativeTypeConfig; import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*; -import org.zwobble.hobgoblin.compiler.parser.Parser; import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo; import org.zwobble.hobgoblin.compiler.types.*; import org.zwobble.json5.reader.Json5ObjectReader; @@ -21,78 +21,26 @@ import static org.zwobble.hobgoblin.compiler.util.Casing.lowerCamelCaseToUpperCa public class JavaTypesGenerator implements Generator { public static final String NAME = "java-types"; private static final String BUILDER_TYPE_NAME = "Builder"; - private static final Map DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries( - Map.entry(NativeTypes.INT_32, JavaNativeTypeConfig.of(JavaTypeRef.INT, new JavaIntegerLiteral(0))), - Map.entry(NativeTypes.STRING, JavaNativeTypeConfig.of(JavaTypeRef.STRING, new JavaStringLiteral(""))), - Map.entry(NativeTypes.LIST_INNER, JavaNativeTypeConfig.of(JavaTypeRef.LIST, new JavaStaticMethodCall(JavaTypeRef.LIST, "of", List.of()))) - ); public static OutputConfig parseOutputConfig(Path projectRoot, Json5ObjectReader output) { return () -> { var relativeOutputPath = output.getString("path").value(); var outputPath = projectRoot.resolve(relativeOutputPath); - var packageName = output.getString("packageName").value(); - var namespaceConfigs = parseNamespaceConfigs(output); - var nativeTypeConfigs = parseNativeTypeConfigs(output); + var javaConfig = JavaGeneratorConfig.parseOutputConfig(output); - return new JavaTypesGenerator(outputPath, packageName, namespaceConfigs, nativeTypeConfigs); + return new JavaTypesGenerator(outputPath, javaConfig); }; } - private static Map parseNamespaceConfigs(Json5ObjectReader output) { - var namespaceConfigs = new HashMap(); - output.getArrayOfObjects("namespaces").ifPresent(namespacesJson -> { - for (var namespaceJson : namespacesJson) { - var hobgoblinNamespaceString = namespaceJson.getString("hobgoblin").valueAsSourceText(); - var hobgoblinNamespace = Parser.parseNamespaceName(hobgoblinNamespaceString); - - var javaPackageString = namespaceJson.getString("java").value(); - var javaPackage = Arrays.asList(javaPackageString.split("\\.")); - - namespaceConfigs.put(hobgoblinNamespace, new JavaNamespaceConfig(javaPackage)); - } - }); - - return namespaceConfigs; - } - - private static Map parseNativeTypeConfigs(Json5ObjectReader output) { - var nativeTypeConfigs = new HashMap(DEFAULT_NATIVE_TYPE_CONFIGS); - output.getArrayOfObjects("nativeTypes").ifPresent(nativeTypesJson -> { - for (var nativeTypeJson : nativeTypesJson) { - var hobgoblinTypeString = nativeTypeJson.getString("hobgoblin").valueAsSourceText(); - var hobgoblinTypeName = Parser.parseQualifiedTypeName(hobgoblinTypeString); - var hobgoblinType = new SimpleNativeType( - hobgoblinTypeName.namespaceName(), - hobgoblinTypeName.name() - ); - - var javaTypeString = nativeTypeJson.getString("java").value(); - var javaTypeParts = Arrays.asList(javaTypeString.split("\\.")); - var javaTypeRef = JavaTypeRef.topLevel(javaTypeParts.subList(0, javaTypeParts.size() - 1), javaTypeParts.getLast()); - - nativeTypeConfigs.put(hobgoblinType, new JavaNativeTypeConfig(javaTypeRef, Optional.empty())); - } - }); - - return nativeTypeConfigs; - } - private final Path sourceRootDirectory; - private final List packageName; - private final Map namespaceConfigs; - private final Map nativeTypeConfigs; + private final JavaGeneratorConfig javaGeneratorConfig; public JavaTypesGenerator( Path sourceRootDirectory, - String packageName, - Map namespaceConfigs, - Map nativeTypeConfigs + JavaGeneratorConfig javaGeneratorConfig ) { this.sourceRootDirectory = sourceRootDirectory; - this.packageName = List.of(packageName.split("\\.")); - this.namespaceConfigs = namespaceConfigs; - this.nativeTypeConfigs = nativeTypeConfigs; + this.javaGeneratorConfig = javaGeneratorConfig; } @Override @@ -296,12 +244,12 @@ public class JavaTypesGenerator implements Generator { private List namespaceToJavaPackageParts(NamespaceName namespaceName) { // TODO: handle subpackages - var namespaceConfig = this.namespaceConfigs.get(namespaceName); + var namespaceConfig = this.javaGeneratorConfig.namespaceConfigs().get(namespaceName); if (namespaceConfig != null) { return namespaceConfig.packageName(); } - return JavaGenerator.namespaceToJavaPackageParts(this.packageName, namespaceName); + return JavaGenerator.namespaceToJavaPackageParts(this.javaGeneratorConfig.packageName(), namespaceName); } private JavaTypeRef generateTypeRef( @@ -463,7 +411,7 @@ public class JavaTypesGenerator implements Generator { } private Optional nativeTypeConfig(SimpleNativeType type) { - return Optional.ofNullable(this.nativeTypeConfigs.get(type)); + return Optional.ofNullable(this.javaGeneratorConfig.nativeTypeConfigs().get(type)); } private static class Context { -- cgit v1.2.3