From 5f280cb33680b51eda3c84b8e685d0ccf95f2fcb Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 29 May 2026 11:36:27 +0100 Subject: Support configuration of individual namespaces --- .../generators/javatypes/JavaNamespaceConfig.java | 6 ++ .../generators/javatypes/JavaTypesGenerator.java | 69 ++++++++++++++++------ 2 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNamespaceConfig.java (limited to 'src') 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 new file mode 100644 index 0000000..314875c --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNamespaceConfig.java @@ -0,0 +1,6 @@ +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/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java index 95b33f6..0c4b8b8 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 @@ -30,40 +30,67 @@ public class JavaTypesGenerator implements Generator { 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 nativeTypeConfigs = new HashMap(DEFAULT_NATIVE_TYPE_CONFIGS); - output.getArrayOfObjects("nativeTypes").ifPresent(nativeTypesJson -> { - for (var nativeTypeJson : nativeTypesJson) { - var hobgoblinTypeString = nativeTypeJson.getString("hobgoblin").value(); - var hobgoblinTypeParts = Arrays.asList(hobgoblinTypeString.split("\\.")); - var hobgoblinType = new SimpleNativeType( - new NamespaceName(hobgoblinTypeParts.subList(0, hobgoblinTypeParts.size() - 1)), - hobgoblinTypeParts.getLast() - ); + return new JavaTypesGenerator(outputPath, packageName, namespaceConfigs, nativeTypeConfigs); + }; + } - var javaTypeString = nativeTypeJson.getString("java").value(); - var javaTypeParts = Arrays.asList(javaTypeString.split("\\.")); - var javaTypeRef = JavaTypeRef.topLevel(javaTypeParts.subList(0, javaTypeParts.size() - 1), javaTypeParts.getLast()); + private static Map parseNamespaceConfigs(Json5ObjectReader output) { + var namespaceConfigs = new HashMap(); + output.getArrayOfObjects("namespaces").ifPresent(namespacesJson -> { + for (var namespaceJson : namespacesJson) { + var hobgoblinNamespaceString = namespaceJson.getString("hobgoblin").value(); + var hobgoblinNamespaceParts = Arrays.asList(hobgoblinNamespaceString.split("/")); + var hobgoblinNamespace = new NamespaceName(hobgoblinNamespaceParts); - nativeTypeConfigs.put(hobgoblinType, new JavaNativeTypeConfig(javaTypeRef, Optional.empty())); - } - }); + var javaPackageString = namespaceJson.getString("java").value(); + var javaPackage = Arrays.asList(javaPackageString.split("\\.")); - return new JavaTypesGenerator(outputPath, packageName, nativeTypeConfigs); - }; + 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").value(); + var hobgoblinTypeParts = Arrays.asList(hobgoblinTypeString.split("\\.")); + var hobgoblinType = new SimpleNativeType( + new NamespaceName(hobgoblinTypeParts.subList(0, hobgoblinTypeParts.size() - 1)), + hobgoblinTypeParts.getLast() + ); + + 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; public JavaTypesGenerator( Path sourceRootDirectory, String packageName, + Map namespaceConfigs, Map nativeTypeConfigs ) { this.sourceRootDirectory = sourceRootDirectory; this.packageName = List.of(packageName.split("\\.")); + this.namespaceConfigs = namespaceConfigs; this.nativeTypeConfigs = nativeTypeConfigs; } @@ -221,7 +248,13 @@ public class JavaTypesGenerator implements Generator { ); } - private ArrayList namespaceToJavaPackageParts(NamespaceName namespaceName) { + private List namespaceToJavaPackageParts(NamespaceName namespaceName) { + // TODO: handle subpackages + var namespaceConfig = this.namespaceConfigs.get(namespaceName); + if (namespaceConfig != null) { + return namespaceConfig.packageName(); + } + var packageParts = new ArrayList<>(this.packageName); packageParts.addAll(namespaceName.parts()); return packageParts; -- cgit v1.2.3