summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-06-12 17:34:33 +0100
committerMichael Williamson <mike@zwobble.org>2026-06-12 17:34:33 +0100
commit74a6782f2489c8709c61d80f5b62519fa509a9b0 (patch)
tree287f24b224997f4087e9f5e2c5540d291fb4b0be /src/main/java
parent75bcba051893198ef18d3e86ccfe85a5f6c36c6b (diff)
Extract JavaGeneratorConfig
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java77
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNamespaceConfig.java (renamed from src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNamespaceConfig.java)2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNativeTypeConfig.java (renamed from src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java)2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java72
4 files changed, 89 insertions, 64 deletions
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<String> packageName,
+ Map<NamespaceName, JavaNamespaceConfig> namespaceConfigs,
+ Map<SimpleNativeType, JavaNativeTypeConfig> 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<NamespaceName, JavaNamespaceConfig> parseNamespaceConfigs(Json5ObjectReader output) {
+ var namespaceConfigs = new HashMap<NamespaceName, JavaNamespaceConfig>();
+ 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<SimpleNativeType, JavaNativeTypeConfig> parseNativeTypeConfigs(Json5ObjectReader output) {
+ var nativeTypeConfigs = new HashMap<SimpleNativeType, JavaNativeTypeConfig>(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<SimpleNativeType, JavaNativeTypeConfig> 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/javatypes/JavaNamespaceConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNamespaceConfig.java
index 314875c..3c313cd 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNamespaceConfig.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNamespaceConfig.java
@@ -1,4 +1,4 @@
-package org.zwobble.hobgoblin.compiler.output.generators.javatypes;
+package org.zwobble.hobgoblin.compiler.output.generators.java;
import java.util.List;
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/java/JavaNativeTypeConfig.java
index 7bae0f6..54e99b2 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaNativeTypeConfig.java
@@ -1,4 +1,4 @@
-package org.zwobble.hobgoblin.compiler.output.generators.javatypes;
+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;
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<SimpleNativeType, JavaNativeTypeConfig> 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<NamespaceName, JavaNamespaceConfig> parseNamespaceConfigs(Json5ObjectReader output) {
- var namespaceConfigs = new HashMap<NamespaceName, JavaNamespaceConfig>();
- 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<SimpleNativeType, JavaNativeTypeConfig> parseNativeTypeConfigs(Json5ObjectReader output) {
- var nativeTypeConfigs = new HashMap<SimpleNativeType, JavaNativeTypeConfig>(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<String> packageName;
- private final Map<NamespaceName, JavaNamespaceConfig> namespaceConfigs;
- private final Map<SimpleNativeType, JavaNativeTypeConfig> nativeTypeConfigs;
+ private final JavaGeneratorConfig javaGeneratorConfig;
public JavaTypesGenerator(
Path sourceRootDirectory,
- String packageName,
- Map<NamespaceName, JavaNamespaceConfig> namespaceConfigs,
- Map<SimpleNativeType, JavaNativeTypeConfig> 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<String> 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<JavaNativeTypeConfig> nativeTypeConfig(SimpleNativeType type) {
- return Optional.ofNullable(this.nativeTypeConfigs.get(type));
+ return Optional.ofNullable(this.javaGeneratorConfig.nativeTypeConfigs().get(type));
}
private static class Context {