docs: public Description describeForAssignment(AssignmentTree assignmentTree, VisitorState state) {
  
      // the statement that is the parent of the self-assignment expression
      Tree parent = state.getPath().getParentPath().getLeaf();
  
      // default fix is to delete assignment
      Fix fix = SuggestedFix.delete(parent);
  
      ExpressionTree lhs = assignmentTree.getVariable();
      ExpressionTree rhs = assignmentTree.getExpression();
  
      // if this is a method invocation, they must be calling checkNotNull()
      if (assignmentTree.getExpression().getKind() == METHOD_INVOCATION) {
        // change the default fix to be "checkNotNull(x)" instead of "x = checkNotNull(x)"
        fix = SuggestedFix.replace(assignmentTree, state.getSourceForNode(rhs));
        // new rhs is first argument to checkNotNull()
        rhs = stripNullCheck(rhs, state);
      }
      rhs = skipCast(rhs);
  
      ImmutableList<Fix> exploratoryFieldFixes = ImmutableList.of();
      if (lhs.getKind() == MEMBER_SELECT) {
        // find a method parameter of the same type and similar name and suggest it
        // as the rhs
  
        // rhs should be either identifier or field access
        Preconditions.checkState(rhs.getKind() == IDENTIFIER || rhs.getKind() == MEMBER_SELECT);
  
        Type rhsType = ASTHelpers.getType(rhs);
        exploratoryFieldFixes =
            ReplacementVariableFinder.fixesByReplacingExpressionWithMethodParameter(
                rhs, varDecl -> ASTHelpers.isSameType(rhsType, varDecl.type, state), state);
      } else if (rhs.getKind() == IDENTIFIER) {
        // find a field of the same type and similar name and suggest it as the lhs
        // lhs should be identifier
        Preconditions.checkState(lhs.getKind() == IDENTIFIER);
  
        Type lhsType = ASTHelpers.getType(lhs);
        exploratoryFieldFixes =
            ReplacementVariableFinder.fixesByReplacingExpressionWithLocallyDeclaredField(
                lhs,
                var ->
                    !Flags.isStatic(var.sym)
                        && (var.sym.flags() & Flags.FINAL) == 0
                        && ASTHelpers.isSameType(lhsType, var.type, state),
                state);
      }
  
      if (exploratoryFieldFixes.isEmpty()) {
        return describeMatch(assignmentTree, fix);
      }
  
      return buildDescription(assignmentTree).addAllFixes(exploratoryFieldFixes).build();
    }