1 16 package com.google.gwt.dev.js; 17 18 import com.google.gwt.dev.js.ast.JsBinaryOperation; 19 import com.google.gwt.dev.js.ast.JsBinaryOperator; 20 import com.google.gwt.dev.js.ast.JsContext; 21 import com.google.gwt.dev.js.ast.JsExpression; 22 import com.google.gwt.dev.js.ast.JsModVisitor; 23 import com.google.gwt.dev.js.ast.JsPostfixOperation; 24 import com.google.gwt.dev.js.ast.JsPrefixOperation; 25 import com.google.gwt.dev.js.ast.JsProgram; 26 import com.google.gwt.dev.js.ast.JsUnaryOperation; 27 import com.google.gwt.dev.js.ast.JsUnaryOperator; 28 29 38 public class JsNormalizer { 39 40 43 private class JsNormalizing extends JsModVisitor { 44 45 public void endVisit(JsBinaryOperation x, JsContext ctx) { 46 maybeShuffleModifyingBinary(x, ctx); 47 } 48 49 public void endVisit(JsPostfixOperation x, JsContext ctx) { 50 maybeShuffleModifyingUnary(x, ctx); 51 } 52 53 public void endVisit(JsPrefixOperation x, JsContext ctx) { 54 maybeShuffleModifyingUnary(x, ctx); 55 } 56 57 62 private void maybeShuffleModifyingBinary(JsBinaryOperation x, JsContext ctx) { 63 JsBinaryOperator myOp = x.getOperator(); 64 JsExpression lhs = x.getArg1(); 65 JsExpression rhs = x.getArg2(); 66 67 if (myOp.isAssignment() && (lhs instanceof JsBinaryOperation)) { 68 JsBinaryOperation curLhs = (JsBinaryOperation) lhs; 70 assert (curLhs.getOperator() == JsBinaryOperator.COMMA); 71 while (curLhs.getArg2() instanceof JsBinaryOperation) { 72 curLhs = (JsBinaryOperation) curLhs.getArg2(); 73 assert (curLhs.getOperator() == JsBinaryOperator.COMMA); 74 } 75 x.setArg1(curLhs.getArg2()); 77 curLhs.setArg2(x); 78 ctx.replaceMe(lhs); 80 } 81 } 82 83 88 private void maybeShuffleModifyingUnary(JsUnaryOperation x, JsContext ctx) { 89 JsUnaryOperator myOp = x.getOperator(); 90 JsExpression arg = x.getArg(); 91 if (myOp.isModifying() && (arg instanceof JsBinaryOperation)) { 92 JsBinaryOperation curArg = (JsBinaryOperation) arg; 94 assert (curArg.getOperator() == JsBinaryOperator.COMMA); 95 while (curArg.getArg2() instanceof JsBinaryOperation) { 96 curArg = (JsBinaryOperation) curArg.getArg2(); 97 assert (curArg.getOperator() == JsBinaryOperator.COMMA); 98 } 99 x.setArg(curArg.getArg2()); 101 curArg.setArg2(x); 102 ctx.replaceMe(arg); 104 } 105 } 106 } 107 108 public static void exec(JsProgram program) { 109 new JsNormalizer(program).execImpl(); 110 } 111 112 private final JsProgram program; 113 114 private JsNormalizer(JsProgram program) { 115 this.program = program; 116 } 117 118 private void execImpl() { 119 JsNormalizing normalizer = new JsNormalizing(); 120 normalizer.accept(program); 121 } 122 } 123 | Popular Tags |