docs: private static Optional<Fix> rewriteCompoundAssignment(
        CompoundAssignmentTree tree, VisitorState state) {
      CharSequence var = state.getSourceForNode(tree.getVariable());
      CharSequence expr = state.getSourceForNode(tree.getExpression());
      if (var == null || expr == null) {
        return Optional.absent();
      }
      switch (tree.getKind()) {
        case RIGHT_SHIFT_ASSIGNMENT:
          // narrowing the result of a signed right shift does not lose information
          return Optional.absent();
        default:
          break;
      }
      Kind regularAssignmentKind = regularAssignmentFromCompound(tree.getKind());
      String op = assignmentToString(regularAssignmentKind);
  
      // Add parens to the rhs if necessary to preserve the current precedence
      // e.g. 's -= 1 - 2' -> 's = s - (1 - 2)'
      OperatorPrecedence rhsPrecedence =
          tree.getExpression() instanceof JCBinary
              ? OperatorPrecedence.from(tree.getExpression().getKind())
              : tree.getExpression() instanceof ConditionalExpressionTree
                  ? OperatorPrecedence.TERNARY
                  : null;
  
      if (rhsPrecedence != null) {
        if (!rhsPrecedence.isHigher(OperatorPrecedence.from(regularAssignmentKind))) {
          expr = String.format("(%s)", expr);
        }
      }
  
      // e.g. 's *= 42' -> 's = (short) (s * 42)'
      String castType = getType(tree.getVariable()).toString();
      String replacement = String.format("%s = (%s) (%s %s %s)", var, castType, var, op, expr);
      return Optional.of(SuggestedFix.replace(tree, replacement));
    }