public Object visitExprBinary(ExprBinary exp) { switch (exp.getOp()) { case ExprBinary.BINOP_GE: case ExprBinary.BINOP_GT: case ExprBinary.BINOP_LE: case ExprBinary.BINOP_LT: { Type oldType = type; Type tleft = getType(exp.getLeft()); Type tright = getType(exp.getRight()); Type tt = tright.leastCommonPromotion(tleft, nres); type = tt; // TypePrimitive.inttype; Expression left = doExpression(exp.getLeft()); Expression right = doExpression(exp.getRight()); type = oldType; if (left == exp.getLeft() && right == exp.getRight()) return exp; else return new ExprBinary(exp, exp.getOp(), left, right, exp.getAlias()); } case ExprBinary.BINOP_LSHIFT: case ExprBinary.BINOP_RSHIFT: { Expression left = doExpression(exp.getLeft()); Type oldType = type; type = TypePrimitive.inttype; Expression right = doExpression(exp.getRight()); type = oldType; if (left == exp.getLeft() && right == exp.getRight()) return exp; else return new ExprBinary(exp, exp.getOp(), left, right, exp.getAlias()); } case ExprBinary.BINOP_NEQ: case ExprBinary.BINOP_EQ: { Type tleft = stv.getType(exp.getLeft()); Type tright = stv.getType(exp.getRight()); Type tboth = tleft.leastCommonPromotion(tright, nres); Type oldType = type; type = tboth; Expression left = doExpression(exp.getLeft()); Expression right = doExpression(exp.getRight()); type = oldType; if (left == exp.getLeft() && right == exp.getRight()) return exp; else return new ExprBinary(exp, exp.getOp(), left, right, exp.getAlias()); } default: return super.visitExprBinary(exp); } }