aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 12:00:08 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 12:00:08 +0100
commitd2769fe60d264607f2e1c338657dc7e4d4bfba52 (patch)
tree787d0041a3f11e8c1ed72dfc6e5ef9a0fca93e1f /src
parent3b620b72664afaa5168bfdb2ce763555a7bfbd20 (diff)
Type check expression statements
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java20
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java9
-rw-r--r--src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java4
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java27
4 files changed, 60 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 11f902b1..f707dac0 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -138,6 +138,26 @@ public class TypeChecker {
};
}
+ private static TypedFunctionStatementNode typeCheckExpressionStatement(
+ UntypedExpressionStatementNode untyped,
+ TypeCheckerContext context
+ ) {
+ return new TypedExpressionStatementNode(
+ typeCheckExpression(untyped.expression(), context),
+ untyped.source()
+ );
+ }
+
+ public static TypedFunctionStatementNode typeCheckFunctionStatement(
+ UntypedExpressionStatementNode untyped,
+ TypeCheckerContext context
+ ) {
+ return switch (untyped) {
+ case UntypedExpressionStatementNode expressionStatement ->
+ typeCheckExpressionStatement(expressionStatement, context);
+ };
+ }
+
private static TypedExpressionNode typeCheckIntLiteral(
UntypedIntLiteralNode untyped
) {
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 acf61900..e6127108 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
@@ -26,6 +26,15 @@ public class TypedNodeMatchers {
return TypedCallNodeMatcher.empty();
}
+ public static Matcher<TypedFunctionStatementNode> isTypedExpressionStatementNode(
+ Matcher<TypedExpressionNode> expression
+ ) {
+ return instanceOf(
+ TypedExpressionStatementNode.class,
+ has("expression", x -> x.expression(), expression)
+ );
+ }
+
public static Matcher<TypedExpressionNode> isTypedIntLiteralNode(int value) {
return isTypedIntLiteralNode(BigInteger.valueOf(value));
}
diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
index 5cc0ce85..170857b9 100644
--- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
+++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
@@ -33,6 +33,10 @@ public class Untyped {
);
}
+ public static UntypedExpressionStatementNode expressionStatement(UntypedExpressionNode expression) {
+ return new UntypedExpressionStatementNode(expression, Sources.NULL);
+ }
+
public static UntypedIntLiteralNode intLiteral(int value) {
return new UntypedIntLiteralNode(BigInteger.valueOf(value), Sources.NULL);
}
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java
new file mode 100644
index 00000000..29175665
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java
@@ -0,0 +1,27 @@
+package org.shedlang.compiler.typechecker;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.ast.typed.Typed;
+import org.shedlang.compiler.ast.untyped.Untyped;
+import org.shedlang.compiler.typechecker.errors.UnknownVariableError;
+import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.util.P;
+
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedExpressionStatementNode;
+import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedStringLiteralNode;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+
+public class TypeCheckerExpressionStatementTests {
+ @Test
+ public void expressionIsTypeChecked() {
+ var untyped = Untyped.expressionStatement(Untyped.stringLiteral("hello"));
+
+ var typed = TypeChecker.typeCheckFunctionStatement(untyped, TypeCheckerContext.EMPTY);
+
+ assertThat(typed, isTypedExpressionStatementNode(isTypedStringLiteralNode("hello")));
+ }
+}