diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-09-27 19:04:35 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-09-27 19:04:35 +0100 |
| commit | 5f601c97d55f203abea55546bf4d232f7534d06c (patch) | |
| tree | a6828a7a6106467195f0bc152968817176e89091 /src | |
| parent | 2dcc2a9a3278a39ce366953c13e45468535f627e (diff) | |
Extract parseNativeTypeConfigs()
Diffstat (limited to 'src')
3 files changed, 49 insertions, 32 deletions
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 <T> Map<SimpleNativeType, T> parseNativeTypeConfigs( + Json5ObjectReader output, + Map<SimpleNativeType, T> defaultNativeTypeConfigs, + Function<Json5ObjectReader, T> 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<SimpleNativeType, JavaNativeTypeConfig> parseNativeTypeConfigs(Json5ObjectReader output) { - var nativeTypeConfigs = new HashMap<SimpleNativeType, JavaNativeTypeConfig>(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<JavaIdentifier> 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<SimpleNativeType, RustNativeTypeConfig> parseNativeTypeConfigs(Json5ObjectReader output) { - // TODO: remove duplication with Java config - var nativeTypeConfigs = new HashMap<SimpleNativeType, RustNativeTypeConfig>(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<SimpleNativeType, RustNativeTypeConfig> DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries( |
