diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-03-02 14:29:17 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-03-02 14:29:17 +0000 |
| commit | 5dee33c017ab75c6ac14d26ff18e4995135e26ea (patch) | |
| tree | 7406321496e76647c0e054e5a4e5ab9f014eeaa8 /src/test/java | |
| parent | 933913f816ea34d10a3c2904c46c7e59498f00fa (diff) | |
Add type-level params into function body environment
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java | 46 |
1 files changed, 42 insertions, 4 deletions
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; @@ -82,6 +79,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( Untyped.expressionStatement(Untyped.reference("x")) |
