if (!x.getArg1().hasSideEffects()) {
ctx.replaceMe(x.getArg2());
return;
}
JsBinaryOperation toUpdate = isComma(x.getArg2());
if (toUpdate == null) {
/*
* We have a JsBinaryOperation that's structurally normal: (X, a). Now
* it may be the case that the inner expression X is a comma expression
* (Y, b). If b creates no side-effects, we can remove it, leaving (Y,
* a) as the expression.
*/
JsBinaryOperation inner = isComma(x.getArg1());
if (inner != null && !inner.getArg2().hasSideEffects()) {
x.setArg1(inner.getArg1());
didChange = true;
}
return;
}
// Find the left-most, nested comma expression
while (isComma(toUpdate.getArg1()) != null) {
toUpdate = (JsBinaryOperation) toUpdate.getArg1();
}
/*
* Create a new comma expression with the original LHS and the LHS of the
* nested comma expression.
*/
JsBinaryOperation newOp = new JsBinaryOperation(JsBinaryOperator.COMMA);
newOp.setArg1(x.getArg1());
newOp.setArg2(toUpdate.getArg1());
// Set the LHS of the nested comma expression to the new comma expression
toUpdate.setArg1(newOp);
// Replace the original node with its updated RHS