This change simplifies expression mutation so that VisitExpr intercepts all expressions and wraps relevant ones in function calls that handle constant replacement and unary operator insertion, and then checks whether the expression is a unary or binary operator to invoke more specialised mutations when this is the case.
This makes the code simpler, and will make various enhancements simpler (e.g., related to when the whole expression evaluates to 0, which otherwise would have to be handled separately for each of the unary, binary and general expression cases).
This change simplifies expression mutation so that VisitExpr intercepts all expressions and wraps relevant ones in function calls that handle constant replacement and unary operator insertion, and then checks whether the expression is a unary or binary operator to invoke more specialised mutations when this is the case.
This makes the code simpler, and will make various enhancements simpler (e.g., related to when the whole expression evaluates to 0, which otherwise would have to be handled separately for each of the unary, binary and general expression cases).