From fa240b137df27cf6a938eb0432ef62ad7ba718e4 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 5 Jul 2023 21:45:09 +0100 Subject: Parse implicit return --- .../compiler/ast/untyped/UntypedNodeMatchers.java | 9 +++++ .../parser/ParserFunctionDefinitionTests.java | 43 +++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) (limited to 'src/test/java') 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 ad6c8a49..1f74008d 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java @@ -79,6 +79,15 @@ public class UntypedNodeMatchers { ); } + public static Matcher isUntypedReturnNode( + Matcher expression + ) { + return instanceOf( + UntypedReturnNode.class, + has("expression", x -> x.expression(), expression) + ); + } + public static Matcher isUntypedStringLiteralNode(String value) { return instanceOf( UntypedStringLiteralNode.class, diff --git a/src/test/java/org/shedlang/compiler/parser/ParserFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/parser/ParserFunctionDefinitionTests.java index c9961426..0f96b59b 100644 --- a/src/test/java/org/shedlang/compiler/parser/ParserFunctionDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/parser/ParserFunctionDefinitionTests.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.parser; import org.junit.jupiter.api.Test; +import org.shedlang.compiler.tokeniser.UnexpectedTokenException; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.*; @@ -182,7 +183,7 @@ public class ParserFunctionDefinitionTests { } @Test - public void canParseFunctionWithBody() { + public void canParseFunctionWithBodyWithoutReturn() { var source = """ fun f() -> Unit { a; @@ -202,4 +203,44 @@ public class ParserFunctionDefinitionTests { )) ); } + + @Test + public void canParseFunctionWithBodyWithImplicitReturn() { + var source = """ + fun f() -> Unit { + a; + b; + c + }"""; + + var node = parseString(source, Parser::parseNamespaceStatement); + + assertThat( + node, + isUntypedFunctionDefinitionNode() + .withBody(isSequence( + isUntypedExpressionStatementNode(isUntypedReferenceNode("a")), + isUntypedExpressionStatementNode(isUntypedReferenceNode("b")), + isUntypedReturnNode(isUntypedReferenceNode("c")) + )) + ); + } + + @Test + public void implicitReturnEndsFunction() { + var source = """ + fun f() -> Unit { + a; + b + c + }"""; + + var error = assertThrows( + UnexpectedTokenException.class, + () -> parseString(source, Parser::parseNamespaceStatement) + ); + + assertThat(error.getActual().value(), equalTo("c")); + assertThat(error.getExpected(), equalTo(TokenType.SYMBOL_BRACE_CLOSE.toString())); + } } -- cgit v1.2.3