From 217cef25875d3ef04f055bed64752db9b2fbb21e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 27 Sep 2023 11:30:36 +0100 Subject: Support ignore target --- .../java/org/shedlang/compiler/ast/typed/Typed.java | 4 ++++ .../shedlang/compiler/ast/typed/TypedNodeMatchers.java | 4 ++++ .../java/org/shedlang/compiler/ast/untyped/Untyped.java | 4 ++++ .../compiler/ast/untyped/UntypedNodeMatchers.java | 4 ++++ .../org/shedlang/compiler/parser/ParserAssignTests.java | 12 ++++++++++++ .../compiler/stackir/StackCompilerAssignTests.java | 17 +++++++++++++++++ .../compiler/typechecker/TypeCheckerAssignTests.java | 16 ++++++++++++++++ 7 files changed, 61 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java index 0d48711c..42a46859 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java @@ -182,6 +182,10 @@ public class Typed { ); } + public static TypedTargetNode targetIgnore() { + return new TypedTargetNode.Ignore(Sources.NULL); + } + public static TypedTargetNode targetReassign(String name) { return new TypedTargetNode.Reassign(name, Sources.NULL); } 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 c8b0501d..52d91cdf 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -221,6 +221,10 @@ public class TypedNodeMatchers { ); } + public static Matcher isTypedTargetIgnore() { + return instanceOf(TypedTargetNode.Ignore.class); + } + public static Matcher isTypedTargetReassign(String name) { return instanceOf( TypedTargetNode.Reassign.class, 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 36668a8b..a87b1c48 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java @@ -150,6 +150,10 @@ public class Untyped { ); } + public static UntypedTargetNode targetIgnore() { + return new UntypedTargetNode.Ignore(Sources.NULL); + } + public static UntypedTargetNode targetReassign(String name) { return new UntypedTargetNode.Reassign(name, Sources.NULL); } diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java index 37d432e8..7d80b4ab 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java @@ -190,6 +190,10 @@ public class UntypedNodeMatchers { return isUntypedBinaryOperationNode(UntypedBinaryOperator.SUB, left, right); } + public static Matcher isUntypedTargetIgnoreNode() { + return instanceOf(UntypedTargetNode.Ignore.class); + } + public static Matcher isUntypedTargetReassignNode(String name) { return instanceOf( UntypedTargetNode.Reassign.class, diff --git a/src/test/java/org/shedlang/compiler/parser/ParserAssignTests.java b/src/test/java/org/shedlang/compiler/parser/ParserAssignTests.java index 9c29d328..7dc07722 100644 --- a/src/test/java/org/shedlang/compiler/parser/ParserAssignTests.java +++ b/src/test/java/org/shedlang/compiler/parser/ParserAssignTests.java @@ -34,4 +34,16 @@ public class ParserAssignTests { isUntypedReferenceNode("z") )); } + + @Test + public void canParseIgnoreTarget() { + var source = "_ = x;"; + + var node = parseString(source, Parser::parseFunctionStatement); + + assertThat(node, isUntypedAssignNode( + isUntypedTargetIgnoreNode(), + isUntypedReferenceNode("x") + )); + } } diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerAssignTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerAssignTests.java index b717648a..7c49af0a 100644 --- a/src/test/java/org/shedlang/compiler/stackir/StackCompilerAssignTests.java +++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerAssignTests.java @@ -10,6 +10,23 @@ import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.isSequence; public class StackCompilerAssignTests { + @Test + public void targetIgnoreIsCompiledToDiscard() { + var node = Typed.assign( + Typed.targetIgnore(), + Typed.reference("x") + ); + var context = StackCompiler.Context.EMPTY + .addShedVariable("x"); + + var result = StackCompiler.compileFunctionStatement(node, context); + + assertThat(result.instructions(), isSequence( + isLocalLoadInstruction("x__0"), + isDiscardInstruction() + )); + } + @Test public void whenTargetIsReassignThenExpressionIsEvaluatedAndStoredAsVar() { var node = Typed.assign( diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerAssignTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerAssignTests.java index eb2a2db1..9bd07ffd 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerAssignTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerAssignTests.java @@ -23,6 +23,22 @@ import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.*; public class TypeCheckerAssignTests { + @Test + public void canTypeCheckTargetIgnore() { + var untyped = Untyped.assign(Untyped.targetIgnore(), Untyped.stringLiteral("hello")); + var context = TypeCheckerContext.EMPTY + .enterNamespace(P.map( + Map.entry("x", Variable.defined(Types.STRING, VariableType.VAR)) + )); + + var typed = typeCheckFunctionStatement(untyped, context); + + assertThat(typed.value(), isTypedAssignNode( + isTypedTargetIgnore(), + isTypedStringLiteralNode("hello") + )); + } + @Test public void canTypeCheckReassign() { var untyped = Untyped.assign(Untyped.targetReassign("x"), Untyped.stringLiteral("hello")); -- cgit v1.2.3