From 5f601c97d55f203abea55546bf4d232f7534d06c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 27 Sep 2026 19:04:35 +0100 Subject: Extract parseNativeTypeConfigs() --- .../generators/configs/NativeTypeConfigs.java | 35 ++++++++++++++++++++++ .../generators/java/JavaGeneratorConfig.java | 21 +++++-------- .../generators/rust/RustGeneratorConfig.java | 25 +++++----------- 3 files changed, 49 insertions(+), 32 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/generators/configs/NativeTypeConfigs.java diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/configs/NativeTypeConfigs.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/configs/NativeTypeConfigs.java new file mode 100644 index 0000000..1c6b88f --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/configs/NativeTypeConfigs.java @@ -0,0 +1,35 @@ +package org.zwobble.hobgoblin.compiler.output.generators.configs; + +import org.zwobble.hobgoblin.compiler.parser.Parser; +import org.zwobble.hobgoblin.compiler.types.SimpleNativeType; +import org.zwobble.json5.reader.Json5ObjectReader; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public class NativeTypeConfigs { + private NativeTypeConfigs() {} + + public static Map parseNativeTypeConfigs( + Json5ObjectReader output, + Map defaultNativeTypeConfigs, + Function read + ) { + var nativeTypeConfigs = new HashMap<>(defaultNativeTypeConfigs); + output.getArrayOfObjectsOrNone("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() + ); + + nativeTypeConfigs.put(hobgoblinType, read.apply(nativeTypeJson)); + } + }); + + return nativeTypeConfigs; + } +} 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 index 032f474..ccb6416 100644 --- 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 @@ -1,6 +1,7 @@ package org.zwobble.hobgoblin.compiler.output.generators.java; import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; +import org.zwobble.hobgoblin.compiler.output.generators.configs.NativeTypeConfigs; import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*; import org.zwobble.hobgoblin.compiler.parser.Parser; import org.zwobble.hobgoblin.compiler.types.NamespaceName; @@ -46,16 +47,10 @@ public record JavaGeneratorConfig( } private static Map parseNativeTypeConfigs(Json5ObjectReader output) { - var nativeTypeConfigs = new HashMap(DEFAULT_NATIVE_TYPE_CONFIGS); - output.getArrayOfObjectsOrNone("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() - ); - + return NativeTypeConfigs.parseNativeTypeConfigs( + output, + DEFAULT_NATIVE_TYPE_CONFIGS, + nativeTypeJson -> { var javaTypeString = nativeTypeJson.getString("java").value(); var javaTypeParts = Arrays.stream(javaTypeString.split("\\.")) .map(JavaIdentifier::of) @@ -63,11 +58,9 @@ public record JavaGeneratorConfig( var javaPackageName = new JavaPackageName(javaTypeParts.subList(0, javaTypeParts.size() - 1)); var javaTypeRef = JavaTypeRef.topLevel(javaPackageName, javaTypeParts.getLast()); - nativeTypeConfigs.put(hobgoblinType, new JavaNativeTypeConfig(javaTypeRef, Optional.empty(), Optional.empty())); + return new JavaNativeTypeConfig(javaTypeRef, Optional.empty(), Optional.empty()); } - }); - - return nativeTypeConfigs; + ); } private static List parseJavaPackageName(String packageName) { diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java index 7ba66d1..15e18bd 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java @@ -1,13 +1,12 @@ package org.zwobble.hobgoblin.compiler.output.generators.rust; import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; +import org.zwobble.hobgoblin.compiler.output.generators.configs.NativeTypeConfigs; import org.zwobble.hobgoblin.compiler.output.lang.rust.RustTypes; import org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath; -import org.zwobble.hobgoblin.compiler.parser.Parser; import org.zwobble.hobgoblin.compiler.types.SimpleNativeType; import org.zwobble.json5.reader.Json5ObjectReader; -import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -29,26 +28,16 @@ public record RustGeneratorConfig( } private static Map parseNativeTypeConfigs(Json5ObjectReader output) { - // TODO: remove duplication with Java config - var nativeTypeConfigs = new HashMap(DEFAULT_NATIVE_TYPE_CONFIGS); - output.getArrayOfObjectsOrNone("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() - ); - + return NativeTypeConfigs.parseNativeTypeConfigs( + output, + DEFAULT_NATIVE_TYPE_CONFIGS, + nativeTypeJson -> { // TODO: less hacky type representation var rustTypeString = nativeTypeJson.getString("rust").value(); var rustType = RustPath.of(rustTypeString); - - nativeTypeConfigs.put(hobgoblinType, new RustNativeTypeConfig(rustType)); + return new RustNativeTypeConfig(rustType); } - }); - - return nativeTypeConfigs; + ); } private static final Map DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries( -- cgit v1.2.3