aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-03-02 19:52:06 +0000
committerMichael Williamson <mike@zwobble.org>2025-03-02 19:52:06 +0000
commit1f73c6fcd01e6c3b3c0e7ca0b30fb46de56f0b59 (patch)
tree06baf6af546824ef947e569cd710ea7c1cffa723 /src/test/java/org
parentcc6d23ae352e4ec3d700926057d4751027b6063f (diff)
Add native type type params to environment
Diffstat (limited to 'src/test/java/org')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNativeTypeDeclarationTests.java59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNativeTypeDeclarationTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNativeTypeDeclarationTests.java
index 562b7ab4..024773c8 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNativeTypeDeclarationTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNativeTypeDeclarationTests.java
@@ -281,4 +281,63 @@ public class TypeCheckerNativeTypeDeclarationTests {
))
);
}
+
+ @Test
+ public void whenNativeTypeIsGenericThenTypeParamsCanBeUsedInNativeMethodDeclarations() {
+ var untyped = UntypedNativeTypeDeclarationNode.builder()
+ .withName("ExampleType")
+ .withTypeLevelParams(List.of(Untyped.typeParam("T")))
+ .addMethod(
+ UntypedNativeFunctionDeclarationNode.builder()
+ .withName("a")
+ .addPositionalParam(Untyped.typeLevelReference("This"))
+ .addPositionalParam(Untyped.typeLevelReference("T"))
+ .withReturnType(Untyped.typeLevelReference("Unit"))
+ .build()
+ )
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enterGlobal(P.map(
+ Map.entry("Unit", Types.metaType(Types.UNIT))
+ ));
+
+ var typed = typeCheckNamespaceStatement(untyped, context);
+
+ assertThat(
+ typed.value(),
+ isTypedNativeTypeDeclarationNode()
+ .withMethods(isSequence(
+ isTypedNativeFunctionDeclarationNode()
+ .withSignature(
+ FunctionType.builder()
+ .addPositionalParam(Types.constructedType(
+ Types.typeConstructor(
+ List.of(
+ TypeParam.forNativeType(Types.nativeType(NAMESPACE_NAME, "ExampleType"), "T")
+ ),
+ Types.nativeType(NAMESPACE_NAME, "ExampleType")
+ ),
+ List.of(TypeParam.forNativeType(Types.nativeType(NAMESPACE_NAME, "ExampleType"), "T"))
+ ))
+ .addPositionalParam(TypeParam.forNativeType(Types.nativeType(NAMESPACE_NAME, "ExampleType"), "T"))
+ .build()
+ )
+ ))
+ );
+ var nativeTypeInfo = typed.context().toTypeInfos()
+ .nativeTypeInfo(Types.nativeType(NAMESPACE_NAME, "ExampleType"))
+ .orElseThrow();
+ assertThat(
+ nativeTypeInfo,
+ has("methods", x -> x.methods(), isSequence(
+ equalTo(new MethodInfo(
+ "a",
+ FunctionType.builder()
+ .addPositionalParam(TypeParam.forNativeType(Types.nativeType(NAMESPACE_NAME, "ExampleType"), "T"))
+ .withReturnType(Types.UNIT)
+ .build()
+ ))
+ ))
+ );
+ }
}