internal void Render(LuaAssignmentExpressionSyntax node) { node.Left.Render(this); WriteSpace(); Write(node.OperatorToken); WriteSpace(); node.Right.Render(this); }
public override LuaSyntaxNode VisitConditionalAccessExpression(ConditionalAccessExpressionSyntax node) { bool isEmpty = functions_.Count == 0; if (isEmpty) { LuaFunctionExpressionSyntax function = new LuaFunctionExpressionSyntax(); PushFunction(function); blocks_.Push(function.Body); } var temp = GetTempIdentifier(node.Expression); conditionalTemps_.Push(temp); var expression = (LuaExpressionSyntax)node.Expression.Accept(this); CurBlock.Statements.Add(new LuaLocalVariableDeclaratorSyntax(temp, expression)); LuaBinaryExpressionSyntax condition = new LuaBinaryExpressionSyntax(temp, LuaSyntaxNode.Tokens.NotEquals, LuaIdentifierNameSyntax.Nil); LuaIfStatementSyntax ifStatement = new LuaIfStatementSyntax(condition); CurBlock.Statements.Add(ifStatement); blocks_.Push(ifStatement.Body); var whenNotNull = (LuaExpressionSyntax)node.WhenNotNull.Accept(this); blocks_.Pop(); conditionalTemps_.Pop(); if (node.Parent.IsKind(SyntaxKind.ExpressionStatement)) { if (isEmpty) { throw new InvalidOperationException(); } ifStatement.Body.Statements.Add(new LuaExpressionStatementSyntax(whenNotNull)); return(LuaExpressionSyntax.EmptyExpression); } else { LuaAssignmentExpressionSyntax assignment = new LuaAssignmentExpressionSyntax(temp, whenNotNull); ifStatement.Body.Statements.Add(new LuaExpressionStatementSyntax(assignment)); if (isEmpty) { var function = CurFunction; function.AddStatement(new LuaReturnStatementSyntax(temp)); blocks_.Pop(); PopFunction(); return(new LuaInvocationExpressionSyntax(new LuaParenthesizedExpressionSyntax(function))); } else { return(temp); } } }