summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-28 19:18:53 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-28 19:18:53 +0100
commitdab3e3e24b485e732c9419620557c5f83ff7984e (patch)
treec98cf454bd5966b8451d2c73b971aaf5b1511ccc
parentaf0f173fcc0bf84316e188a0e6d4da4dfe11b021 (diff)
Pass supplier for each type param in arbitrary generic native func
-rw-r--r--examples/12-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java7
-rw-r--r--examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java9
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java19
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java9
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()
);
});
}