From 9bace82acaf0ef7ec4c83203c262544f3dd7cae2 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Mar 2024 11:14:20 +0000 Subject: Use type level params when type checking function signature --- .../TypeCheckerFunctionSignatureTests.java | 55 ++++++++++++++++++++-- 1 file changed, 50 insertions(+), 5 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionSignatureTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionSignatureTests.java index 3ffc8bc6..f0d13333 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionSignatureTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionSignatureTests.java @@ -3,11 +3,12 @@ package org.shedlang.compiler.typechecker; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.ast.untyped.UntypedFunctionSignatureNode; -import org.shedlang.compiler.types.Effects; -import org.shedlang.compiler.types.Types; +import org.shedlang.compiler.types.*; import org.shedlang.compiler.util.P; +import java.util.List; import java.util.Map; +import java.util.Optional; import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*; import static org.shedlang.compiler.typechecker.TypeChecker.typeCheckFunctionSignature; @@ -23,7 +24,7 @@ public class TypeCheckerFunctionSignatureTests { var context = TypeCheckerContext.EMPTY .enterGlobal(P.map(Map.entry("Unit", Types.metaType(Types.UNIT)))); - var typed = typeCheckFunctionSignature(untyped, context); + var typed = typeCheckFunctionSignature(untyped, Optional.empty(), context); assertThat( typed, @@ -48,7 +49,7 @@ public class TypeCheckerFunctionSignatureTests { Map.entry("Unit", Types.metaType(Types.UNIT)) )); - var typed = typeCheckFunctionSignature(untyped, context); + var typed = typeCheckFunctionSignature(untyped, Optional.empty(), context); assertThat( typed, @@ -84,7 +85,7 @@ public class TypeCheckerFunctionSignatureTests { Map.entry("Unit", Types.metaType(Types.UNIT)) )); - var typed = typeCheckFunctionSignature(untyped, context); + var typed = typeCheckFunctionSignature(untyped, Optional.empty(), context); assertThat( typed, @@ -92,4 +93,48 @@ public class TypeCheckerFunctionSignatureTests { .withEffect(isOptionalOf(isTypedTypeLevelReferenceNode("Io", Effects.IO))) ); } + + @Test + public void paramTypesCanReferenceTypeLevelParams() { + var untyped = UntypedFunctionSignatureNode.builder() + .withTypeLevelParams(List.of( + Untyped.typeLevelParam("T") + )) + .addPositionalParam("x", Untyped.typeLevelReference("T")) + .build(); + var namespaceName = NamespaceName.of("Example"); + var context = TypeCheckerContext.EMPTY + .enterNamespace(namespaceName, P.map()); + + var typed = typeCheckFunctionSignature( + untyped, + Optional.of(new Scope.Function(namespaceName, "f")), + context + ); + + assertThat( + typed, + isTypedFunctionSignatureNode() + .withParams( + isTypedParamsNode( + isSequence( + isTypedParamNode( + "x", + isOptionalOf( + isTypedTypeLevelReferenceNode( + "T", + TypeParam.forFunction( + namespaceName, + "f", + "T" + ) + ) + ) + ) + ), + isSequence() + ) + ) + ); + } } -- cgit v1.2.3