diff --git a/JSS.Lib.UnitTests/ParserTests.cs b/JSS.Lib.UnitTests/ParserTests.cs index 3997581..95fa88d 100644 --- a/JSS.Lib.UnitTests/ParserTests.cs +++ b/JSS.Lib.UnitTests/ParserTests.cs @@ -754,6 +754,24 @@ public void Parse_ReturnsReturnStatement_WithNoExpression_WhenProvidingReturn_Wi returnStatement!.ReturnExpression.Should().BeNull(); } + [Test] + public void Parse_ReturnsReturnStatement_WithNoExpression_WhenProvidingReturn_WithNewLineThenExpression() + { + // Arrange + var parser = new Parser("return\n1"); + + // Act + var parsedProgram = ParseScript(parser); + var rootNodes = parsedProgram.ScriptCode; + + // Assert + rootNodes.Should().HaveCount(2); + + var returnStatement = rootNodes[0] as ReturnStatement; + returnStatement.Should().NotBeNull(); + returnStatement!.ReturnExpression.Should().BeNull(); + } + [TestCaseSource(nameof(expressionToExpectedTypeTestCases))] public void Parse_ReturnsReturnStatement_WhenProvidingReturn(KeyValuePair expressionToExpectedType) { diff --git a/JSS.Lib/Parser.cs b/JSS.Lib/Parser.cs index 0f50575..3e7c487 100644 --- a/JSS.Lib/Parser.cs +++ b/JSS.Lib/Parser.cs @@ -1705,8 +1705,8 @@ private ReturnStatement ParseReturnStatement() { _consumer.ConsumeTokenOfType(TokenType.Return); - // FIXME: return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; - // Don't parse an expression if there is a line terminator after the return + if (_consumer.IsLineTerminator()) return new ReturnStatement(null); + TryParseExpression(out IExpression? returnExpression); return new ReturnStatement(returnExpression); }