aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-03-02 11:14:20 +0000
committerMichael Williamson <mike@zwobble.org>2024-03-02 11:14:20 +0000
commit9bace82acaf0ef7ec4c83203c262544f3dd7cae2 (patch)
tree8ac638af309301df720b1ada8f30eeb10f86c0f5 /src/test/java
parente7d00f5a62e0f03161dbc12939840d332dc76506 (diff)
Use type level params when type checking function signature
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionSignatureTests.java55
1 files changed, 50 insertions, 5 deletions
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()
+ )
+ )
+ );
+ }
}