Beispiel #1
0
        internal string DoStatement(Statement s, ref int i)
        {
            // If the statement contains a body, we cant just fromTokens it, as it's body might not be
            // fully tokenized input. Therefore, we run DoChunk on Body's

            if (s.ScannedTokens != null && s.ScannedTokens.Count > 0)
            {
                if (s is AssignmentStatement && !(s is AugmentedAssignmentStatement))
                {
                    AssignmentStatement a  = s as AssignmentStatement;
                    StringBuilder       sb = new StringBuilder();
                    if (a.IsLocal)
                    {
                        sb.Append(fromToken(a.ScannedTokens[i++], a.Scope));
                        sb.Append(" ");
                    }
                    for (int i2 = 0; i2 < a.Lhs.Count; i2++)
                    {
                        sb.Append(DoExpr(a.Lhs[i2], s.ScannedTokens, ref i, s.Scope));
                        if (i2 != a.Lhs.Count - 1)
                        {
                            sb.Append(fromToken(a.ScannedTokens[i++], a.Scope));
                            sb.Append(" ");
                        }
                    }
                    if (a.Rhs.Count > 0)
                    {
                        sb.Append(" ");
                        sb.Append(fromToken(a.ScannedTokens[i++], a.Scope));
                        sb.Append(" ");
                        for (int i2 = 0; i2 < a.Rhs.Count; i2++)
                        {
                            sb.Append(DoExpr(a.Rhs[i2], s.ScannedTokens, ref i, s.Scope));
                            if (i2 != a.Rhs.Count - 1)
                            {
                                sb.Append(fromToken(a.ScannedTokens[i++], s.Scope));
                                sb.Append(" ");
                            }
                        }
                    }

                    return(sb.ToString());
                }
                else if (s is AugmentedAssignmentStatement)
                {
                    AugmentedAssignmentStatement a = s as AugmentedAssignmentStatement;
                    StringBuilder sb = new StringBuilder();
                    //sb.Append(DoExpr(a.Lhs[0]));
                    if (a.IsLocal)
                    {
                        sb.Append(fromToken(a.ScannedTokens[i++], a.Scope));
                        sb.Append(" ");
                    }
                    Expression assignment = ((BinOpExpr)a.Rhs[0]).Rhs;
                    Expression tmp        = ((BinOpExpr)a.Rhs[0]).Lhs;
                    sb.Append(DoExpr(tmp, s.ScannedTokens, ref i, s.Scope));
                    sb.Append(" ");
                    sb.Append(fromToken(s.ScannedTokens[i++], s.Scope));
                    sb.Append(" ");
                    sb.Append(DoExpr(assignment, s.ScannedTokens, ref i, s.Scope));
                    return(sb.ToString());
                }
                else if (s is BreakStatement)
                {
                    // HAHAHA this is incredibly simple...
                    return(fromTokens(s.ScannedTokens, s.Scope));
                }
                else if (s is ContinueStatement)
                {
                    return(fromTokens(s.ScannedTokens, s.Scope));
                }
                else if (s is CallStatement)
                {
                    // Also incredibly simple...
                    return(DoExpr(((CallStatement)s).Expression, s.ScannedTokens, ref i, s.Scope));
                }
                else if (s is DoStatement)
                {
                    DoStatement   d  = s as DoStatement;
                    StringBuilder sb = new StringBuilder();
                    sb.Append(fromToken(d.ScannedTokens[0], s.Scope)); // 'do'
                    sb.Append(options.EOL);
                    indent++;
                    sb.Append(DoChunk(d.Body, ref i));
                    sb.Append(nldedent());
                    sb.Append(fromToken(d.ScannedTokens[d.ScannedTokens.Count - 1], s.Scope)); // end
                    return(sb.ToString());
                }
                else if (s is GenericForStatement)
                {
                    GenericForStatement g  = s as GenericForStatement;
                    StringBuilder       sb = new StringBuilder();
                    sb.Append(fromToken(g.ScannedTokens[i++], s.Scope)); // 'for'
                    sb.Append(" ");
                    for (int x = 0; x < g.VariableList.Count; x++)
                    {
                        sb.Append(fromToken(s.ScannedTokens[i++], s.Scope));
                        if (x != g.VariableList.Count - 1)
                        {
                            sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // ','
                            sb.Append(" ");
                        }
                    }
                    sb.Append(" ");
                    sb.Append(fromToken(g.ScannedTokens[i++], s.Scope)); // 'in'
                    sb.Append(" ");
                    for (int x = 0; x < g.Generators.Count; x++)
                    {
                        //sb.Append(fromToken(s.ScannedTokens[i++], s.Scope));
                        DoExpr(g.Generators[x], g.ScannedTokens, ref i, s.Scope);
                        if (x != g.VariableList.Count - 1)
                        {
                            sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // ','
                            sb.Append(" ");
                        }
                    }
                    sb.Append(" ");
                    sb.Append(fromToken(g.ScannedTokens[i++], s.Scope)); // 'do'
                    sb.Append(options.EOL);
                    indent++;
                    sb.Append(DoChunk(g.Body));
                    sb.Append(nldedent());
                    sb.Append(fromToken(s.ScannedTokens[s.ScannedTokens.Count - 1], s.Scope)); // <end>
                    return(sb.ToString());
                }
                else if (s is NumericForStatement)
                {
                    NumericForStatement n  = s as NumericForStatement;
                    StringBuilder       sb = new StringBuilder();
                    sb.Append(fromToken(n.ScannedTokens[i++], s.Scope));         // 'for'
                    sb.Append(" ");
                    sb.Append(fromToken(n.ScannedTokens[i++], s.Scope));         // <var>
                    sb.Append(" ");
                    sb.Append(fromToken(n.ScannedTokens[i++], s.Scope));         // '='
                    sb.Append(" ");
                    sb.Append(DoExpr(n.Start, n.ScannedTokens, ref i, s.Scope)); // <start>
                    //sb.Append(" ");
                    sb.Append(fromToken(n.ScannedTokens[i++], s.Scope));         // ','
                    sb.Append(" ");
                    sb.Append(DoExpr(n.End, n.ScannedTokens, ref i, s.Scope));   // <end>
                    if (n.Step != null)
                    {
                        sb.Append(fromToken(n.ScannedTokens[i++], s.Scope));        // ','
                        sb.Append(" ");
                        sb.Append(DoExpr(n.Step, n.ScannedTokens, ref i, s.Scope)); // <step>
                        sb.Append(" ");
                    }
                    else
                    {
                        sb.Append(" ");
                    }
                    sb.Append(fromToken(n.ScannedTokens[i++], s.Scope)); // 'do'
                    sb.Append(options.EOL);
                    indent++;
                    sb.Append(DoChunk(n.Body));
                    sb.Append(nldedent());
                    sb.Append(fromToken(s.ScannedTokens[s.ScannedTokens.Count - 1], s.Scope)); // <end>
                    return(sb.ToString());
                }
                else if (s is FunctionStatement)
                {
                    FunctionStatement f  = s as FunctionStatement;
                    StringBuilder     sb = new StringBuilder();

                    sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // 'function'
                    sb.Append(" ");
                    sb.Append(DoExpr(f.Name, s.ScannedTokens, ref i, s.Scope));
                    sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // '('
                    for (int i2 = 0; i2 < f.Arguments.Count; i2++)
                    {
                        sb.Append(fromToken(s.ScannedTokens[i++], s.Scope));
                        if (i2 != f.Arguments.Count - 1)// || f.IsVararg)
                        {
                            sb.Append(fromToken(s.ScannedTokens[i++], s.Scope));
                            sb.Append(" ");
                        }
                    }
                    if (f.IsVararg)
                    {
                        sb.Append(fromToken(s.ScannedTokens[i++], s.Scope));
                        sb.Append(" ");
                        sb.Append(fromToken(s.ScannedTokens[i++], s.Scope));
                    }
                    sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // ')'
                    sb.Append(options.EOL);
                    indent++;
                    sb.Append(DoChunk(f.Body));
                    indent--;
                    sb.Append(options.EOL);
                    sb.Append(writeIndent());
                    sb.Append(fromToken(s.ScannedTokens[s.ScannedTokens.Count - 1], s.Scope)); // <end>

                    sb.Append(options.EOL);

                    return(sb.ToString());
                }
                else if (s is GotoStatement)
                {
                    // goto <string label>, so no expr
                    //GotoStatement g = s as GotoStatement;
                    return(fromTokens(s.ScannedTokens, s.Scope));
                }
                else if (s is IfStmt)
                {
                    IfStmt        ifs = s as IfStmt;
                    StringBuilder sb  = new StringBuilder();

                    foreach (SubIfStmt clause in ifs.Clauses)
                    {
                        int i3 = 0;
                        if (clause is ElseIfStmt)
                        {
                            ElseIfStmt c = clause as ElseIfStmt;

                            sb.Append(fromToken(c.ScannedTokens[i3++], s.Scope)); // if/elseif
                            sb.Append(" ");
                            sb.Append(DoExpr(c.Condition, c.ScannedTokens, ref i3, c.Scope));
                            sb.Append(" ");
                            sb.Append(fromToken(c.ScannedTokens[i3++], s.Scope)); // 'then'
                            sb.Append(options.EOL);
                            indent++;
                            sb.Append(DoChunk(clause.Body));
                            sb.Append(nldedent());
                        }
                        else if (clause is ElseStmt)
                        {
                            sb.Append(fromToken(clause.ScannedTokens[i3++], s.Scope)); // if/elseif
                            sb.Append(options.EOL);
                            indent++;
                            sb.Append(DoChunk(clause.Body));
                            sb.Append(nldedent());
                        }
                        else
                        {
                            throw new NotImplementedException(clause.GetType().Name);
                        }
                    }
                    sb.Append(fromToken(s.ScannedTokens[s.ScannedTokens.Count - 1], s.Scope)); // 'end'
                    return(sb.ToString());
                }
                else if (s is LabelStatement)
                {
                    // ::<string label>::, so no expr
                    return(fromTokens(s.ScannedTokens, s.Scope));
                }
                else if (s is RepeatStatement)
                {
                    RepeatStatement r  = s as RepeatStatement;
                    StringBuilder   sb = new StringBuilder();
                    sb.Append(fromToken(r.ScannedTokens[0], s.Scope));
                    i = 1;
                    sb.Append(options.EOL);
                    indent++;
                    sb.Append(DoChunk(r.Body, ref i));
                    sb.Append(nldedent());
                    sb.Append(fromToken(r.ScannedTokens[i++], r.Scope));
                    sb.Append(" ");
                    sb.Append(DoExpr(r.Condition, r.ScannedTokens, ref i, r.Scope));
                    return(sb.ToString());
                }
                else if (s is ReturnStatement)
                {
                    ReturnStatement rs = s as ReturnStatement;
                    StringBuilder   sb = new StringBuilder();
                    sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // 'return'
                    sb.Append(" ");
                    for (int x = 0; x < rs.Arguments.Count; x++)
                    {
                        sb.Append(DoExpr(rs.Arguments[x], rs.ScannedTokens, ref i, s.Scope));
                        if (x != rs.Arguments.Count - 1)
                        {
                            sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // ','
                            sb.Append(" ");
                        }
                    }
                    return(sb.ToString());
                }
                else if (s is UsingStatement)
                {
                    UsingStatement u  = s as UsingStatement;
                    StringBuilder  sb = new StringBuilder();
                    sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // 'using'
                    sb.Append(" ");

                    AssignmentStatement a = u.Vars;
                    for (int i2 = 0; i2 < a.Lhs.Count; i2++)
                    {
                        sb.Append(DoExpr(a.Lhs[i2], u.ScannedTokens, ref i, s.Scope));
                        if (i2 != a.Lhs.Count - 1)
                        {
                            sb.Append(fromToken(u.ScannedTokens[i++], a.Scope));
                            sb.Append(" ");
                        }
                    }
                    if (a.Rhs.Count > 0)
                    {
                        sb.Append(" ");
                        sb.Append(fromToken(u.ScannedTokens[i++], a.Scope)); // '='
                        sb.Append(" ");
                        for (int i2 = 0; i2 < a.Rhs.Count; i2++)
                        {
                            sb.Append(DoExpr(a.Rhs[i2], u.ScannedTokens, ref i, s.Scope));
                            if (i2 != a.Rhs.Count - 1)
                            {
                                sb.Append(fromToken(u.ScannedTokens[i++], s.Scope));
                                sb.Append(" ");
                            }
                        }
                    }
                    sb.Append(" ");
                    sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // 'do'
                    sb.Append(options.EOL);
                    indent++;
                    sb.Append(DoChunk(u.Body));
                    sb.Append(nldedent());
                    sb.Append(fromToken(s.ScannedTokens[s.ScannedTokens.Count - 1], s.Scope)); // 'end'
                    return(sb.ToString());
                }
                else if (s is WhileStatement)
                {
                    WhileStatement w  = s as WhileStatement;
                    StringBuilder  sb = new StringBuilder();
                    sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // 'while'
                    sb.Append(" ");
                    sb.Append(DoExpr(w.Condition, w.ScannedTokens, ref i, s.Scope));
                    sb.Append(" ");
                    sb.Append(fromToken(s.ScannedTokens[i++], s.Scope)); // 'do'
                    sb.Append(options.EOL);
                    indent++;
                    sb.Append(DoChunk(w.Body));
                    sb.Append(nldedent());
                    sb.Append(fromToken(s.ScannedTokens[s.ScannedTokens.Count - 1], s.Scope));
                    return(sb.ToString());
                }
            }
            else // No token stream, beautify
            {
                return(beautifier.DoStatement(s));
            }

            throw new NotImplementedException(s.GetType().Name + " is not implemented");
        }