From 79886c47c164aafb25c533ecc20cb93554fa2c08 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 3 Jul 2023 12:03:51 +0100 Subject: Type-check components of val node --- .../compiler/ast/typed/TypedNodeMatchers.java | 18 ++++++++++++++++++ .../org/shedlang/compiler/ast/untyped/Untyped.java | 11 +++++++++++ .../compiler/typechecker/TypeCheckerValTests.java | 21 +++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java (limited to 'src/test/java') 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 26e6acbc..48c67ad1 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -106,6 +106,13 @@ public class TypedNodeMatchers { ); } + public static Matcher isTypedTargetVariable(String name) { + return instanceOf( + TypedTargetNode.Variable.class, + has("name", x -> x.name(), equalTo(name)) + ); + } + public static Matcher> isTypedTypeLevelReferenceNode( String name, TypeLevelValue value @@ -116,4 +123,15 @@ public class TypedNodeMatchers { has("value", x -> x.value(), equalTo(value)) ); } + + public static Matcher isTypedValNode( + Matcher target, + Matcher expression + ) { + return instanceOf( + TypedValNode.class, + has("target", x -> x.target(), target), + has("expression", x -> x.expression(), expression) + ); + } } 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 f93b7d5a..4d61dfc2 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java @@ -69,7 +69,18 @@ public class Untyped { return new UntypedStringLiteralNode(value, Sources.NULL); } + public static UntypedTargetNode targetVariable(String name) { + return new UntypedTargetNode.Variable(name, Sources.NULL); + } + public static UntypedTypeLevelReferenceNode typeLevelReference(String name) { return new UntypedTypeLevelReferenceNode(name, Sources.NULL); } + + public static UntypedValNode val( + UntypedTargetNode target, + UntypedExpressionNode expression + ) { + return new UntypedValNode(target, expression, Sources.NULL); + } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java new file mode 100644 index 00000000..ec1e3c8a --- /dev/null +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java @@ -0,0 +1,21 @@ +package org.shedlang.compiler.typechecker; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.ast.untyped.Untyped; + +import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*; +import static org.zwobble.precisely.AssertThat.assertThat; + +public class TypeCheckerValTests { + @Test + public void expressionIsTypeChecked() { + var untyped = Untyped.val(Untyped.targetVariable("x"), Untyped.stringLiteral("hello")); + + var typed = TypeChecker.typeCheckFunctionStatement(untyped, TypeCheckerContext.EMPTY); + + assertThat(typed.value(), isTypedValNode( + isTypedTargetVariable("x"), + isTypedStringLiteralNode("hello") + )); + } +} -- cgit v1.2.3