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"); }