void AddStatement(StringBuilder luaSB, int indent, SPAGS.Statement statement)
{
switch (statement.Type)
{
case SPAGS.StatementType.Assign:
SPAGS.Statement.Assign assign = (SPAGS.Statement.Assign)statement;
AddExpression(luaSB, 0, assign.Target);
luaSB.Append(" = ");
AddExpression(luaSB, 0, assign.SimpleAssignValue());
luaSB.AppendLine();
break;
case SPAGS.StatementType.Block:
luaSB.AppendLine("do");
AddBlockContent(luaSB, indent + 1, (SPAGS.Statement.Block)statement);
AddIndent(luaSB, indent);
luaSB.AppendLine("end");
break;
case SPAGS.StatementType.Call:
SPAGS.Statement.Call call = (SPAGS.Statement.Call)statement;
if (call.CallExpression.Parameters.Count == 1
&& call.CallExpression.Parameters[0] is SPAGS.Expression.StringLiteral)
{
AddExpression(luaSB, indent, call.CallExpression.CallingOn);
luaSB.Append(" ");
AddExpression(luaSB, indent, call.CallExpression.Parameters[0]);
}
else
{
AddExpression(luaSB, indent, call.CallExpression);
}
luaSB.AppendLine();
break;
case SPAGS.StatementType.If:
SPAGS.Statement.If conditional = (SPAGS.Statement.If)statement;
luaSB.Append("if ");
AddExpression(luaSB, indent, conditional.IfThisIsTrue);
luaSB.AppendLine(" then");
AddBlockContent(luaSB, indent+1, Enblock(conditional.ThenDoThis));
while (conditional.ElseDoThis is SPAGS.Statement.If)
{
conditional = (SPAGS.Statement.If)conditional.ElseDoThis;
AddIndent(luaSB, indent);
luaSB.Append("elseif ");
AddExpression(luaSB, indent, conditional.IfThisIsTrue);
luaSB.AppendLine(" then");
AddBlockContent(luaSB, indent+1, Enblock(conditional.ThenDoThis));
}
if (conditional.ElseDoThis != null)
{
AddIndent(luaSB, indent);
luaSB.AppendLine("else");
AddBlockContent(luaSB, indent+1, Enblock(conditional.ElseDoThis));
}
AddIndent(luaSB, indent);
luaSB.AppendLine("end");
break;
case SPAGS.StatementType.Return:
SPAGS.Statement.Return ret = (SPAGS.Statement.Return)statement;
if (ret.Value == null)
{
luaSB.AppendLine("return");
}
else
{
luaSB.Append("return ");
AddExpression(luaSB, indent, ret.Value);
luaSB.AppendLine();
}
break;
case SPAGS.StatementType.VariableDeclaration:
SPAGS.Statement.VariableDeclaration vardef = (SPAGS.Statement.VariableDeclaration)statement;
luaSB.Append("local ");
for (int i = 0; i < vardef.Variables.Count; i++)
{
if (i > 0) luaSB.Append(", ");
luaSB.Append(vardef.Variables[i].Name);
}
luaSB.Append(" = ");
for (int i = 0; i < vardef.Variables.Count; i++)
{
if (i > 0) luaSB.Append(", ");
if (vardef.Variables[i].InitialValue != null)
{
AddExpression(luaSB, indent, vardef.Variables[i].InitialValue);
}
else
{
AddExpression(luaSB, indent, vardef.Variables[i].Type.CreateDefaultValueExpression());
}
}
luaSB.AppendLine();
break;
case SPAGS.StatementType.While:
SPAGS.Statement.While loop = (SPAGS.Statement.While)statement;
luaSB.Append("while ");
AddExpression(luaSB, indent, loop.WhileThisIsTrue);
luaSB.AppendLine(" do");
AddBlockContent(luaSB, indent+1, Enblock(loop.KeepDoingThis));
AddIndent(luaSB, indent);
luaSB.AppendLine("end");
break;
default:
luaSB.AppendLine("-- " + statement.Type.ToString());
break;
}
}