From 20ffd859e772ce7ea6d596c9d97bacab8da8fb50 Mon Sep 17 00:00:00 2001 From: AnnulusGames Date: Sun, 5 Jan 2025 00:00:58 +0900 Subject: [PATCH 1/2] Add: test --- tests/Lua.Tests/ParserTests.cs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 tests/Lua.Tests/ParserTests.cs diff --git a/tests/Lua.Tests/ParserTests.cs b/tests/Lua.Tests/ParserTests.cs new file mode 100644 index 00000000..1dcda7eb --- /dev/null +++ b/tests/Lua.Tests/ParserTests.cs @@ -0,0 +1,29 @@ +using Lua.CodeAnalysis.Syntax; +using Lua.CodeAnalysis.Syntax.Nodes; + +namespace Lua.Tests +{ + // TODO: add more tests + + public class ParserTests + { + [Test] + public void Test_If_ElseIf_Else_Empty() + { + var source = +@"if true then +elseif true then +else +end"; + var actual = LuaSyntaxTree.Parse(source).Nodes[0]; + var expected = new IfStatementNode( + new() { ConditionNode = new BooleanLiteralNode(true, new(1, 3)), ThenNodes = [] }, + [new() { ConditionNode = new BooleanLiteralNode(true, new(2, 7)), ThenNodes = [] }], + [], + new(1, 0)); + + Assert.That(actual, Is.TypeOf()); + Assert.That(actual.ToString(), Is.EqualTo(expected.ToString())); + } + } +} \ No newline at end of file From 4a103a90e555b50eb0503a57715c386b4217c433 Mon Sep 17 00:00:00 2001 From: AnnulusGames Date: Sun, 5 Jan 2025 00:02:06 +0900 Subject: [PATCH 2/2] Fix: fail to parse empty elseif/else blocks --- src/Lua/CodeAnalysis/Syntax/Parser.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Lua/CodeAnalysis/Syntax/Parser.cs b/src/Lua/CodeAnalysis/Syntax/Parser.cs index 7c572862..99984512 100644 --- a/src/Lua/CodeAnalysis/Syntax/Parser.cs +++ b/src/Lua/CodeAnalysis/Syntax/Parser.cs @@ -309,22 +309,20 @@ IfStatementNode ParseIfStatement(ref SyntaxTokenEnumerator enumerator) MoveNextWithValidation(ref enumerator); enumerator.SkipEoL(); - // skip 'then' keyword - CheckCurrentAndSkip(ref enumerator, SyntaxTokenType.Then, out _); - enumerator.SkipEoL(); + // check 'then' keyword + CheckCurrent(ref enumerator, SyntaxTokenType.Then); // set elseif state state = 1; + + continue; } else if (tokenType is SyntaxTokenType.Else) { - // skip 'else' keywords - MoveNextWithValidation(ref enumerator); - - enumerator.SkipEoL(); - // set else state state = 2; + + continue; } else if (tokenType is SyntaxTokenType.End) {