aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-03 12:11:20 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-03 12:11:20 +0100
commit9a79e487595ac1fdbf4e9c69963440bd979aa107 (patch)
tree91e3099883de790e126d390672afb2085748b7c6 /src/test/java
parent79886c47c164aafb25c533ecc20cb93554fa2c08 (diff)
Define val type
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java4
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java30
2 files changed, 32 insertions, 2 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
index 48c67ad1..ccda182a 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
@@ -125,8 +125,8 @@ public class TypedNodeMatchers {
}
public static Matcher<TypedFunctionStatementNode> isTypedValNode(
- Matcher<TypedTargetNode> target,
- Matcher<TypedExpressionNode> expression
+ Matcher<? super TypedTargetNode> target,
+ Matcher<? super TypedExpressionNode> expression
) {
return instanceOf(
TypedValNode.class,
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java
index ec1e3c8a..8ebe4f79 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java
@@ -2,9 +2,16 @@ package org.shedlang.compiler.typechecker;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.ast.untyped.Untyped;
+import org.shedlang.compiler.ast.untyped.UntypedFunctionDefinitionNode;
+import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.util.P;
+
+import java.util.Map;
import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*;
import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.anything;
+import static org.zwobble.precisely.Matchers.isSequence;
public class TypeCheckerValTests {
@Test
@@ -18,4 +25,27 @@ public class TypeCheckerValTests {
isTypedStringLiteralNode("hello")
));
}
+
+ @Test
+ public void valCanBeReferencedAfterDefinition() {
+ var untyped = UntypedFunctionDefinitionNode.builder()
+ .addStatement(Untyped.val(Untyped.targetVariable("x"), Untyped.stringLiteral("hello")))
+ .addStatement(Untyped.expressionStatement(Untyped.reference("x")))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enterBlock(P.map(
+ Map.entry("Unit", Types.metaType(Types.UNIT))
+ ));
+
+ var typed = TypeChecker.typeCheckNamespaceStatement(untyped, context);
+
+ assertThat(
+ typed,
+ isTypedFunctionDefinitionNode()
+ .withBody(isSequence(
+ isTypedValNode(anything(), anything()),
+ isTypedExpressionStatementNode(isTypedReferenceNode("x", Types.STRING))
+ ))
+ );
+ }
}