aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-03-02 14:29:17 +0000
committerMichael Williamson <mike@zwobble.org>2024-03-02 14:29:17 +0000
commit5dee33c017ab75c6ac14d26ff18e4995135e26ea (patch)
tree7406321496e76647c0e054e5a4e5ab9f014eeaa8 /src/test/java
parent933913f816ea34d10a3c2904c46c7e59498f00fa (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.java46
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"))