From dab3e3e24b485e732c9419620557c5f83ff7984e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 28 Aug 2026 19:18:53 +0100 Subject: Pass supplier for each type param in arbitrary generic native func --- .../zwobble/example/types/map/HobgoblinNativeMap.java | 7 ++++++- .../example/types/data/HobgoblinNativeData.java | 9 +++++++-- .../compiler/analysis/ArbitraryValueAnalysis.java | 19 ++++++++++++++++--- .../generators/javatypes/JavaTypesGenerator.java | 9 ++++++++- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/examples/12-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java b/examples/12-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java index 309ba0b..39fd627 100644 --- a/examples/12-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java +++ b/examples/12-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java @@ -1,9 +1,14 @@ package org.zwobble.example.types.map; +import java.util.function.Supplier; + public class HobgoblinNativeMap { private HobgoblinNativeMap() {} - public static java.util.Map arbitraryNativeMap() { + public static java.util.Map arbitraryNativeMap( + Supplier supplyK, + Supplier supplyV + ) { return new java.util.HashMap<>(); } } diff --git a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java b/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java index 32796b5..cc26b7b 100644 --- a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java +++ b/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java @@ -1,5 +1,7 @@ package org.zwobble.example.types.data; +import java.util.function.Supplier; + public class HobgoblinNativeData { private HobgoblinNativeData() {} @@ -7,7 +9,10 @@ public class HobgoblinNativeData { return new Native(0, 0); } - public static GenericNative arbitraryGenericNative() { - throw new RuntimeException("TODO"); + public static GenericNative arbitraryGenericNative( + Supplier supplyA, + Supplier supplyB + ) { + return new GenericNative<>(supplyA.get(), supplyB.get()); } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java b/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java index 650e753..6664538 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java @@ -15,9 +15,15 @@ public class ArbitraryValueAnalysis { public sealed interface ArbitraryValue { void collectTypeParams(Set typeParams); - record NativeFunctionCall(SimpleNativeType type) implements ArbitraryValue { + record NativeFunctionCall( + SimpleNativeType type, + List args + ) implements ArbitraryValue { @Override public void collectTypeParams(Set typeParams) { + for (var arg : args) { + arg.collectTypeParams(typeParams); + } } } @@ -79,7 +85,14 @@ public class ArbitraryValueAnalysis { yield new ArbitraryValue.Shared(arbitraryValue(constructedNativeType.args().getFirst(), typesInfo)); } - yield new ArbitraryValue.NativeFunctionCall(constructedNativeType.constructor().genericType()); + var args = constructedNativeType.args().stream() + .map(argType -> arbitraryValue(argType, typesInfo)) + .toList(); + + yield new ArbitraryValue.NativeFunctionCall( + constructedNativeType.constructor().genericType(), + args + ); } case ConstructedStructType constructedStructType -> { @@ -106,7 +119,7 @@ public class ArbitraryValueAnalysis { new ArbitraryValue.EnumVariantValue(enumType, typesInfo.enumVariants(enumType).getFirst()); case SimpleNativeType simpleNativeType -> - new ArbitraryValue.NativeFunctionCall(simpleNativeType); + new ArbitraryValue.NativeFunctionCall(simpleNativeType, List.of()); case SimpleStructType simpleStructType -> new ArbitraryValue.SimpleStructBuilder(simpleStructType); 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 3143905..814fe4b 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 @@ -692,7 +692,14 @@ public class JavaTypesGenerator implements Generator { JavaTypeRef.topLevel(javaPackageName, javaClassName), List.of(), generateFieldName("arbitrary" + simpleNativeType.name()), - List.of() + nativeFunctionCall.args().stream() + .map(arg -> new JavaLambdaExpression( + List.of(), + new JavaBlock(List.of( + new JavaReturn(abstractArbitraryValueToJava(arg, context)) + )) + )) + .toList() ); }); } -- cgit v1.2.3