Browse Source

Fix: parser/compiler (generic for)

AnnulusGames 1 year ago
parent
commit
bb3c98e81f

+ 1 - 16
src/Lua/CodeAnalysis/Compilation/LuaCompiler.cs

@@ -909,22 +909,7 @@ public sealed class LuaCompiler : ISyntaxNodeVisitor<ScopeCompilationContext, bo
     {
         // get iterator
         var startPosition = context.StackPosition;
-        if (node.ExpressionNode is CallFunctionExpressionNode call)
-        {
-            CompileCallFunctionExpression(call, context, false, 3);
-        }
-        else if (node.ExpressionNode is CallTableMethodExpressionNode method)
-        {
-            CompileTableMethod(method, context, false, 3);
-        }
-        else if (node.ExpressionNode is VariableArgumentsExpressionNode varArg)
-        {
-            CompileVariableArgumentsExpression(varArg, context, 3);
-        }
-        else
-        {
-            node.ExpressionNode.Accept(this, context);
-        }
+        CompileExpressionList(node, node.ExpressionNodes, 3, context);
 
         // jump to TFORCALL
         var startJumpIndex = context.Function.Instructions.Length;

+ 11 - 11
src/Lua/CodeAnalysis/Syntax/DisplayStringSyntaxVisitor.cs

@@ -111,7 +111,7 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
     {
         node.FunctionNode.Accept(this, context);
         context.Append("(");
-        AddStatementList(node.ArgumentNodes, context);
+        VisitSyntaxNodes(node.ArgumentNodes, context);
         context.Append(")");
         return true;
     }
@@ -141,7 +141,7 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
     public bool VisitFunctionDeclarationExpressionNode(FunctionDeclarationExpressionNode node, Context context)
     {
         context.Append("function(");
-        AddStatementList(node.ParameterNodes, context);
+        VisitSyntaxNodes(node.ParameterNodes, context);
         if (node.HasVariableArguments)
         {
             if (node.ParameterNodes.Length > 0) context.Append(", ");
@@ -168,7 +168,7 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
         context.Append("function ");
         context.Append(node.Name.ToString());
         context.Append("(");
-        AddStatementList(node.ParameterNodes, context);
+        VisitSyntaxNodes(node.ParameterNodes, context);
         if (node.HasVariableArguments)
         {
             if (node.ParameterNodes.Length > 0) context.Append(", ");
@@ -209,7 +209,7 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
         }
 
         context.Append("(");
-        AddStatementList(node.ParameterNodes, context);
+        VisitSyntaxNodes(node.ParameterNodes, context);
         if (node.HasVariableArguments)
         {
             if (node.ParameterNodes.Length > 0) context.Append(", ");
@@ -234,9 +234,9 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
     public bool VisitGenericForStatementNode(GenericForStatementNode node, Context context)
     {
         context.Append($"for ");
-        AddStatementList(node.Names, context);
+        VisitSyntaxNodes(node.Names, context);
         context.Append(" in ");
-        node.ExpressionNode.Accept(this, context);
+        VisitSyntaxNodes(node.ExpressionNodes, context);
         context.AppendLine(" do");
         using (context.BeginIndentScope())
         {
@@ -321,12 +321,12 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
 
     public bool VisitAssignmentStatementNode(AssignmentStatementNode node, Context context)
     {
-        AddStatementList(node.LeftNodes, context);
+        VisitSyntaxNodes(node.LeftNodes, context);
 
         if (node.RightNodes.Length > 0)
         {
             context.Append(" = ");
-            AddStatementList(node.RightNodes, context);
+            VisitSyntaxNodes(node.RightNodes, context);
         }
 
         return true;
@@ -405,7 +405,7 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
     public bool VisitReturnStatementNode(ReturnStatementNode node, Context context)
     {
         context.Append("return ");
-        AddStatementList(node.Nodes, context);
+        VisitSyntaxNodes(node.Nodes, context);
         return true;
     }
 
@@ -491,7 +491,7 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
     {
         node.TableNode.Accept(this, context);
         context.Append($":{node.MethodName}(");
-        AddStatementList(node.ArgumentNodes, context);
+        VisitSyntaxNodes(node.ArgumentNodes, context);
         context.Append(")");
         return true;
     }
@@ -536,7 +536,7 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
         return true;
     }
 
-    void AddStatementList(SyntaxNode[] nodes, Context context)
+    void VisitSyntaxNodes(SyntaxNode[] nodes, Context context)
     {
         for (int i = 0; i < nodes.Length; i++)
         {

+ 1 - 1
src/Lua/CodeAnalysis/Syntax/Nodes/GenericForStatementNode.cs

@@ -1,6 +1,6 @@
 namespace Lua.CodeAnalysis.Syntax.Nodes;
 
-public record GenericForStatementNode(IdentifierNode[] Names, ExpressionNode ExpressionNode, StatementNode[] StatementNodes, SourcePosition Position) : StatementNode(Position)
+public record GenericForStatementNode(IdentifierNode[] Names, ExpressionNode[] ExpressionNodes, StatementNode[] StatementNodes, SourcePosition Position) : StatementNode(Position)
 {
     public override TResult Accept<TContext, TResult>(ISyntaxNodeVisitor<TContext, TResult> visitor, TContext context)
     {

+ 3 - 3
src/Lua/CodeAnalysis/Syntax/Parser.cs

@@ -435,7 +435,7 @@ public ref struct Parser
         CheckCurrentAndSkip(ref enumerator, SyntaxTokenType.In, out _);
         enumerator.SkipEoL();
 
-        var expression = ParseExpression(ref enumerator, OperatorPrecedence.NonOperator);
+        var expressions = ParseExpressionList(ref enumerator);
         MoveNextWithValidation(ref enumerator);
         enumerator.SkipEoL();
 
@@ -445,7 +445,7 @@ public ref struct Parser
         // parse statements
         var statements = ParseStatementList(ref enumerator, SyntaxTokenType.End);
 
-        return new GenericForStatementNode(identifiers, expression, statements, forToken.Position);
+        return new GenericForStatementNode(identifiers, expressions, statements, forToken.Position);
     }
 
     FunctionDeclarationStatementNode ParseFunctionDeclarationStatement(ref SyntaxTokenEnumerator enumerator, SyntaxToken functionToken)
@@ -903,7 +903,7 @@ public ref struct Parser
         while (true)
         {
             enumerator.SkipEoL();
-            
+
             if (!TryParseExpression(ref enumerator, OperatorPrecedence.NonOperator, out var expression))
             {
                 enumerator.MovePrevious();