package nebula.lang; import java.util.HashMap; import java.util.List; import java.util.Map; import nebula.data.Entity; public class JsCompiler implements CompilerBase { StringBuilder sb; Map<String, String> locals; public JsCompiler(String... names) { sb = new StringBuilder(); locals = new HashMap<String, String>(); for (int i = 0; i < names.length; i += 2) { locals.put(names[i], names[i + 1]); } } public static String compiler(Code code, String... names) { JsCompiler c = new JsCompiler(names); code.compile(c); return c.sb.toString(); } @Override public void arithmetic(Operator op, Expr<Object> e1, Expr<Object> e2) { sb.append('('); e1.compile(this); sb.append(op.getSign()); e2.compile(this); sb.append(')'); } @Override public void block(List<Statement> statements) { for (Statement statement : statements) { statement.compile(this); } } @Override public void call(Expr<Object> value) { } @Override public void callMethod(Expr<Entity> e1, String name) { } @Override public void conditional(Operator op, Expr<Boolean> e1, Expr<Boolean> e2) { sb.append('('); e1.compile(this); sb.append(op.getSign()); e2.compile(this); sb.append(')'); } @Override public void constDate(long value) { } @Override public void constDatetime(long value) { } @Override public void constDecimal(String text) { } @Override public void constLong(Long value) { sb.append(value); } @Override public void constString(String value) { sb.append("\""); sb.append(value); sb.append("\""); } @Override public void constTime(long value) { } @Override public void constTimestamp(long value) { } @Override public void constYesno(int value) { if (value == 0) { sb.append("false"); } else { sb.append("true"); } } @Override public void datastoreGet(Expr<Object> repos, String name) { sb.append("$p("); sb.append('"'); sb.append(name); sb.append('"'); sb.append(')'); } @Override public void decrement(Expr<Object> e1) { sb.append('('); sb.append("--"); e1.compile(this); sb.append(')'); } @Override public void get(Expr<Object> list, Expr<Object> index) { list.compile(this); sb.append("["); index.compile(this); sb.append("]"); } @Override public void getField(Expr<Object> entity, String name, Type fieldType) { entity.compile(this); sb.append('.'); sb.append(name); } @Override public void increment(Expr<Object> e1) { sb.append('('); sb.append("++"); e1.compile(this); sb.append(')'); } @Override public void listFilter(Expr<Object> list, List<Expr<Object>> ranges) { sb.append("nebula.filter("); list.compile(this); for (int i = 0; i < ranges.size(); i++) { sb.append(","); ranges.get(i).compile(this); } sb.append(')'); } @Override public void listFilterByClause(Expr<Object> list, Expr<Object> clause, List<Expr<Object>> params) { sb.append("nebula.filter("); list.compile(this); sb.append(","); clause.compile(this); for (int i = 0; i < params.size(); i++) { sb.append(","); params.get(i).compile(this); } sb.append(')'); } @Override public void listGetItem(Expr<Object> list, int index) { list.compile(this); sb.append("["); sb.append(index); sb.append("]"); } @Override public void makeRange_0_To(Expr<Object> to) { // TODO Auto-generated method stub } @Override public void makeRange_From(Expr<Object> from) { // TODO Auto-generated method stub } @Override public void makeRange_From_To(Expr<Object> from, Expr<Object> to) { // TODO Auto-generated method stub } @Override public void makeRangeIndex(Expr<Object> index) { // TODO Auto-generated method stub } @Override public void negates(Expr<Object> e1) { sb.append('('); sb.append('-'); e1.compile(this); sb.append(')'); } @Override public void not(Expr<Boolean> e1) { sb.append('('); sb.append('!'); e1.compile(this); sb.append(')'); } @Override public void paramsRefer(Expr<Object> in, int params, int index) { // TODO Auto-generated method stub } @Override public void positive(Expr<Object> e1) { e1.compile(this); } @Override public void putVar(Var var, Expr<Object> initExpr) { // TODO } @Override public <V> void relational(Operator op, Expr<V> e1, Expr<V> e2) { sb.append('('); e1.compile(this); sb.append(op.getSign()); e2.compile(this); sb.append(')'); } @Override public void setField(Expr<Object> parent, String name, Type fieldType, Expr<Object> value) { parent.compile(this); sb.append('.'); sb.append(name); } @Override public void varRefer(Var var) { sb.append(locals.get(var.name)); } @Override public String toString() { return sb.toString(); } @Override public void stIf(Expr<Object> expr, Statement stIf, Statement stElse) { sb.append("if("); expr.compile(this); sb.append(')'); stIf.compile(this); sb.append("else"); stElse.compile(this); } @Override public void stIf(Expr<Object> expr, Statement stIf) { sb.append("if("); expr.compile(this); sb.append(')'); stIf.compile(this); } }