Browse Source

Merge pull request #73 from AnnulusGames/fix-parser

Fix fail to parse empty `elseif` / `else` blocks
Annulus Games 11 months ago
parent
commit
44513fff35
2 changed files with 35 additions and 8 deletions
  1. 6 8
      src/Lua/CodeAnalysis/Syntax/Parser.cs
  2. 29 0
      tests/Lua.Tests/ParserTests.cs

+ 6 - 8
src/Lua/CodeAnalysis/Syntax/Parser.cs

@@ -309,22 +309,20 @@ public ref struct Parser
                     MoveNextWithValidation(ref enumerator);
                     MoveNextWithValidation(ref enumerator);
                     enumerator.SkipEoL();
                     enumerator.SkipEoL();
 
 
-                    // skip 'then' keyword
-                    CheckCurrentAndSkip(ref enumerator, SyntaxTokenType.Then, out _);
-                    enumerator.SkipEoL();
+                    // check 'then' keyword
+                    CheckCurrent(ref enumerator, SyntaxTokenType.Then);
 
 
                     // set elseif state
                     // set elseif state
                     state = 1;
                     state = 1;
+
+                    continue;
                 }
                 }
                 else if (tokenType is SyntaxTokenType.Else)
                 else if (tokenType is SyntaxTokenType.Else)
                 {
                 {
-                    // skip 'else' keywords
-                    MoveNextWithValidation(ref enumerator);
-
-                    enumerator.SkipEoL();
-
                     // set else state
                     // set else state
                     state = 2;
                     state = 2;
+
+                    continue;
                 }
                 }
                 else if (tokenType is SyntaxTokenType.End)
                 else if (tokenType is SyntaxTokenType.End)
                 {
                 {

+ 29 - 0
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<IfStatementNode>());
+            Assert.That(actual.ToString(), Is.EqualTo(expected.ToString()));
+        }
+    }
+}