@Override public TypedValue binaryOpValue(TypedValue.BinaryOperationValue val, I in) throws E
{
if (remap.containsKey(val)) return remap.get(val);
I param = val.visit(parameter, in);
TypedValue newLeft = val.left.visit(this, param);
TypedValue newRight = val.right.visit(this, param);
newLeft = newLeft.visit(rewriter, param);
newRight = newRight.visit(rewriter, param);
TypedValue newVal = val;
if (newLeft != val.left || newRight != val.right)
newVal = val.withNewChildren(newLeft, newRight);
newVal = newVal.visit(rewriter, in);
remap.put(val, newVal);
return newVal;
}