diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-08-28 19:18:53 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-08-28 19:18:53 +0100 |
| commit | dab3e3e24b485e732c9419620557c5f83ff7984e (patch) | |
| tree | c98cf454bd5966b8451d2c73b971aaf5b1511ccc | |
| parent | af0f173fcc0bf84316e188a0e6d4da4dfe11b021 (diff) | |
Pass supplier for each type param in arbitrary generic native func
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 <K, V> java.util.Map<K, V> arbitraryNativeMap() { + public static <K, V> java.util.Map<K, V> arbitraryNativeMap( + Supplier<K> supplyK, + Supplier<V> 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 <A, B> GenericNative<A, B> arbitraryGenericNative() { - throw new RuntimeException("TODO"); + public static <A, B> GenericNative<A, B> arbitraryGenericNative( + Supplier<A> supplyA, + Supplier<B> 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<TypeParam> typeParams); - record NativeFunctionCall(SimpleNativeType type) implements ArbitraryValue { + record NativeFunctionCall( + SimpleNativeType type, + List<ArbitraryValue> args + ) implements ArbitraryValue { @Override public void collectTypeParams(Set<TypeParam> 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() + .<JavaExpression>map(arg -> new JavaLambdaExpression( + List.of(), + new JavaBlock(List.of( + new JavaReturn(abstractArbitraryValueToJava(arg, context)) + )) + )) + .toList() ); }); } |
