diff options
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"); } |
