From 5dee33c017ab75c6ac14d26ff18e4995135e26ea Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Mar 2024 14:29:17 +0000 Subject: Add type-level params into function body environment --- .../typechecker/TypeCheckerFunctionBodyTests.java | 46 ++++++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java index bcf5e389..1ec485c8 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java @@ -9,10 +9,7 @@ import org.shedlang.compiler.typechecker.errors.CannotCaptureVarError; import org.shedlang.compiler.typechecker.errors.DuplicateVariableNameError; import org.shedlang.compiler.typechecker.errors.UnexpectedTypeError; import org.shedlang.compiler.typechecker.typesets.TypeSets; -import org.shedlang.compiler.types.Effects; -import org.shedlang.compiler.types.FunctionType; -import org.shedlang.compiler.types.NamespaceName; -import org.shedlang.compiler.types.Types; +import org.shedlang.compiler.types.*; import org.shedlang.compiler.util.P; import java.util.List; @@ -81,6 +78,47 @@ public class TypeCheckerFunctionBodyTests { ); } + @Test + public void canReferenceTypeLevelParamInBody() { + var namespaceName = NamespaceName.of("Example"); + var untyped = Untyped.block(List.of( + Untyped.expressionStatement( + UntypedFunctionExpressionNode.builder() + .addPositionalParam("x", Untyped.typeLevelReference("T")) + .withReturnType(Untyped.typeLevelReference("Unit")) + .build() + ) + )); + var typeParam = TypeParam.forFunction(namespaceName, "f", "T"); + var signature = PartialFunctionSignature.builder() + .withTypeLevelParams(List.of( + typeParam + )) + .withReturnType(Types.UNIT) + .build(); + var context = TypeCheckerContext.EMPTY + .enterGlobal(P.map( + Map.entry("Unit", Types.metaType(Types.UNIT)) + )); + + var typed = typeCheckFunctionBody(untyped, signature, context); + + assertThat( + typed.value(), + isTypedFunctionBodyNode() + .withBlock(isTypedBlockNode(isSequence( + isTypedExpressionStatementNode( + isTypedFunctionExpressionNode() + .withType( + FunctionType.builder() + .addPositionalParam(typeParam) + .build() + ) + ) + ))) + ); + } + @Test public void canReferencePositionalArgInBody() { var untyped = Untyped.block(List.of( -- cgit v1.2.3