summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/configs/NativeTypeConfigs.java35
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java21
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java25
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(