summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-29 09:41:31 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-29 09:41:31 +0100
commit67b09b16e951dc543e24bc0e243c834899490cac (patch)
tree38fec474e265d46a63c56590e99e4590e20d6157 /src/main/java
parent812c73f4d853f94da415a107214938540b113893 (diff)
Centralise notion of default Java native types
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java11
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java39
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java2
3 files changed, 24 insertions, 28 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java
index 0cd2a65..7bae0f6 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaNativeTypeConfig.java
@@ -1,6 +1,15 @@
package org.zwobble.hobgoblin.compiler.output.generators.javatypes;
+import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression;
import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef;
-public record JavaNativeTypeConfig(JavaTypeRef javaTypeRef) {
+import java.util.Optional;
+
+public record JavaNativeTypeConfig(
+ JavaTypeRef javaTypeRef,
+ Optional<JavaExpression> arbitraryValue
+) {
+ public static JavaNativeTypeConfig of(JavaTypeRef javaTypeRef, JavaExpression arbitraryValue) {
+ return new JavaNativeTypeConfig(javaTypeRef, Optional.of(arbitraryValue));
+ }
}
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 c2ffb16..736882d 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
@@ -21,6 +21,11 @@ import java.util.*;
public class JavaTypesGenerator implements Generator {
public static final String NAME = "java-types";
private static final String BUILDER_TYPE_NAME = "Builder";
+ private static final Map<SimpleNativeType, JavaNativeTypeConfig> DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries(
+ Map.entry(NativeTypes.INT_32, JavaNativeTypeConfig.of(JavaTypeRef.INT, new JavaIntegerLiteral(0))),
+ Map.entry(NativeTypes.STRING, JavaNativeTypeConfig.of(JavaTypeRef.STRING, new JavaStringLiteral(""))),
+ Map.entry(NativeTypes.LIST_INNER, JavaNativeTypeConfig.of(JavaTypeRef.LIST, new JavaStaticMethodCall(JavaTypeRef.LIST, "of", List.of())))
+ );
public static OutputConfig parseOutputConfig(Path projectRoot, Json5Object output) {
return () -> {
@@ -28,7 +33,7 @@ public class JavaTypesGenerator implements Generator {
var outputPath = projectRoot.resolve(relativeOutputPath);
var packageName = ((Json5String) output.getValue("packageName").orElseThrow()).value();
- var nativeTypeConfigs = new HashMap<SimpleNativeType, JavaNativeTypeConfig>();
+ var nativeTypeConfigs = new HashMap<SimpleNativeType, JavaNativeTypeConfig>(DEFAULT_NATIVE_TYPE_CONFIGS);
output.getValue("nativeTypes").ifPresent(nativeTypesJson -> {
for (var nativeTypeJson : ((Json5Array) nativeTypesJson).elements()) {
var nativeTypeJsonObject = (Json5Object) nativeTypeJson;
@@ -44,7 +49,7 @@ public class JavaTypesGenerator implements Generator {
var javaTypeParts = Arrays.asList(javaTypeString.split("\\."));
var javaTypeRef = JavaTypeRef.topLevel(javaTypeParts.subList(0, javaTypeParts.size() - 1), javaTypeParts.getLast());
- nativeTypeConfigs.put(hobgoblinType, new JavaNativeTypeConfig(javaTypeRef));
+ nativeTypeConfigs.put(hobgoblinType, new JavaNativeTypeConfig(javaTypeRef, Optional.empty()));
}
});
@@ -252,14 +257,6 @@ public class JavaTypesGenerator implements Generator {
var nativeTypeConfig = nativeTypeConfig(simpleNativeType);
if (nativeTypeConfig.isPresent()) {
yield nativeTypeConfig.get().javaTypeRef();
- }
-
- if (type.equals(NativeTypes.INT_32)) {
- yield JavaTypeRef.INT;
- } else if (type.equals(NativeTypes.STRING)) {
- yield JavaTypeRef.STRING;
- } else if (type.equals(NativeTypes.LIST_INNER)) {
- yield JavaTypeRef.topLevel(List.of("java", "util"), "List");
} else {
throw new UnsupportedOperationException("TODO: " + type.describe());
}
@@ -294,29 +291,17 @@ public class JavaTypesGenerator implements Generator {
private JavaExpression arbitraryValue(Type type, Context context) {
return switch (type) {
case ConstructedNativeType constructedNativeType -> {
- if (constructedNativeType.constructor().equals(NativeTypes.LIST)) {
- yield new JavaStaticMethodCall(
- JavaTypeRef.topLevel(List.of("java.util"), "List"),
- "of",
- List.of()
- );
- } else {
- throw new UnsupportedOperationException("TODO");
- }
+ yield arbitraryValue(constructedNativeType.constructor().genericType(), context);
}
case SimpleNativeType simpleNativeType -> {
- if (type.equals(NativeTypes.INT_32)) {
- yield new JavaIntegerLiteral(0);
- } else if (type.equals(NativeTypes.STRING)) {
- yield new JavaStringLiteral("");
- } else {
- yield new JavaStaticMethodCall(
+ yield nativeTypeConfig(simpleNativeType)
+ .flatMap(nativeTypeConfig -> nativeTypeConfig.arbitraryValue())
+ .orElseGet(() -> new JavaStaticMethodCall(
JavaTypeRef.topLevel(namespaceToJavaPackageParts(simpleNativeType.namespaceName()), "Native"),
"arbitrary" + simpleNativeType.name(),
List.of()
- );
- }
+ ));
}
case StructType structType -> {
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java
index 8fcac28..67fbe47 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java
@@ -36,4 +36,6 @@ public record JavaTypeRef(List<String> packageName, List<String> typeNames, List
public static final JavaTypeRef LONG = primitive("long");
public static final JavaTypeRef STRING = primitive("String");
public static final JavaTypeRef VOID = primitive("void");
+
+ public static final JavaTypeRef LIST = topLevel(List.of("java", "util"), "List");
}