diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-05-29 11:36:27 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-05-29 11:36:27 +0100 |
| commit | 5f280cb33680b51eda3c84b8e685d0ccf95f2fcb (patch) | |
| tree | ecf07d5260535ae70f29f32e0cfc8ee7f59ceaed /src | |
| parent | 3c3bc64d157bc216aa196cc60bc155faf564d3c0 (diff) | |
Support configuration of individual namespaces
Diffstat (limited to 'src')
2 files changed, 57 insertions, 18 deletions
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<String> 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<SimpleNativeType, JavaNativeTypeConfig>(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<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").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<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").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<String> packageName; + private final Map<NamespaceName, JavaNamespaceConfig> namespaceConfigs; private final Map<SimpleNativeType, JavaNativeTypeConfig> nativeTypeConfigs; public JavaTypesGenerator( Path sourceRootDirectory, String packageName, + Map<NamespaceName, JavaNamespaceConfig> namespaceConfigs, Map<SimpleNativeType, JavaNativeTypeConfig> 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<String> namespaceToJavaPackageParts(NamespaceName namespaceName) { + private List<String> 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; |
