2
0
Эх сурвалжийг харах

Add: GroupedExpressionNode

AnnulusGames 1 жил өмнө
parent
commit
ccb1407480

+ 5 - 0
src/Lua/CodeAnalysis/Compilation/LuaCompiler.cs

@@ -190,6 +190,11 @@ public sealed class LuaCompiler : ISyntaxNodeVisitor<ScopeCompilationContext, bo
         return true;
     }
 
+    public bool VisitGroupedExpressionNode(GroupedExpressionNode node, ScopeCompilationContext context)
+    {
+        return node.Expression.Accept(this, context);
+    }
+
     // table
     public bool VisitTableConstructorExpressionNode(TableConstructorExpressionNode node, ScopeCompilationContext context)
     {

+ 8 - 2
src/Lua/CodeAnalysis/Syntax/DisplayStringSyntaxVisitor.cs

@@ -89,11 +89,9 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
 
     public bool VisitBinaryExpressionNode(BinaryExpressionNode node, Context context)
     {
-        context.Append("(");
         node.LeftNode.Accept(this, context);
         context.Append($" {node.OperatorType.ToDisplayString()} ");
         node.RightNode.Accept(this, context);
-        context.Append(")");
         return true;
     }
 
@@ -537,4 +535,12 @@ public sealed class DisplayStringSyntaxVisitor : ISyntaxNodeVisitor<DisplayStrin
             if (i != nodes.Length - 1) context.Append(", ");
         }
     }
+
+    public bool VisitGroupedExpressionNode(GroupedExpressionNode node, Context context)
+    {
+        context.Append("(");
+        node.Expression.Accept(this, context);
+        context.Append(")");
+        return true;
+    }
 }

+ 1 - 0
src/Lua/CodeAnalysis/Syntax/ISyntaxNodeVisitor.cs

@@ -10,6 +10,7 @@ public interface ISyntaxNodeVisitor<TContext, TResult>
     TResult VisitStringLiteralNode(StringLiteralNode node, TContext context);
     TResult VisitUnaryExpressionNode(UnaryExpressionNode node, TContext context);
     TResult VisitBinaryExpressionNode(BinaryExpressionNode node, TContext context);
+    TResult VisitGroupedExpressionNode(GroupedExpressionNode node, TContext context);
     TResult VisitIdentifierNode(IdentifierNode node, TContext context);
     TResult VisitDoStatementNode(DoStatementNode node, TContext context);
     TResult VisitFunctionDeclarationExpressionNode(FunctionDeclarationExpressionNode node, TContext context);

+ 9 - 0
src/Lua/CodeAnalysis/Syntax/Nodes/GroupedExpressionNode.cs

@@ -0,0 +1,9 @@
+namespace Lua.CodeAnalysis.Syntax.Nodes;
+
+public record GroupedExpressionNode(ExpressionNode Expression, SourcePosition Position) : ExpressionNode(Position)
+{
+    public override TResult Accept<TContext, TResult>(ISyntaxNodeVisitor<TContext, TResult> visitor, TContext context)
+    {
+        return visitor.VisitGroupedExpressionNode(this, context);
+    }
+}

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

@@ -811,10 +811,10 @@ public ref struct Parser
         return result;
     }
 
-    ExpressionNode ParseGroupedExpression(ref SyntaxTokenEnumerator enumerator)
+    GroupedExpressionNode ParseGroupedExpression(ref SyntaxTokenEnumerator enumerator)
     {
         // skip '('
-        CheckCurrentAndSkip(ref enumerator, SyntaxTokenType.LParen, out _);
+        CheckCurrentAndSkip(ref enumerator, SyntaxTokenType.LParen, out var lParen);
         enumerator.SkipEoL();
 
         var expression = ParseExpression(ref enumerator, GetPrecedence(enumerator.Current.Type));
@@ -823,7 +823,7 @@ public ref struct Parser
         // check ')'
         CheckCurrent(ref enumerator, SyntaxTokenType.RParen);
 
-        return expression;
+        return new GroupedExpressionNode(expression, lParen.Position);
     }
 
     ExpressionNode ParseCallFunctionExpression(ref SyntaxTokenEnumerator enumerator, ExpressionNode? function)