class RuboCop::Cop::Style::SelfAssignment

x += 1
# good
x = x + 1
# bad
@example
Enforces the use the shorthand for self-assignment.

def self.autocorrect_incompatible_with

def self.autocorrect_incompatible_with
  [Layout::SpaceAroundOperators]
end

def apply_autocorrect(corrector, node, rhs, operator, new_rhs)

def apply_autocorrect(corrector, node, rhs, operator, new_rhs)
  corrector.insert_before(node.loc.operator, operator)
  corrector.replace(rhs, new_rhs.source)
end

def autocorrect(corrector, node)

def autocorrect(corrector, node)
  rhs = node.expression
  if rhs.send_type?
    autocorrect_send_node(corrector, node, rhs)
  elsif rhs.operator_keyword?
    autocorrect_boolean_node(corrector, node, rhs)
  end
end

def autocorrect_boolean_node(corrector, node, rhs)

def autocorrect_boolean_node(corrector, node, rhs)
  apply_autocorrect(corrector, node, rhs, rhs.loc.operator.source, rhs.rhs)
end

def autocorrect_send_node(corrector, node, rhs)

def autocorrect_send_node(corrector, node, rhs)
  apply_autocorrect(corrector, node, rhs, rhs.method_name, rhs.first_argument)
end

def check(node, var_type)

def check(node, var_type)
  return unless (rhs = node.expression)
  if rhs.send_type? && rhs.arguments.one?
    check_send_node(node, rhs, node.name, var_type)
  elsif rhs.operator_keyword?
    check_boolean_node(node, rhs, node.name, var_type)
  end
end

def check_boolean_node(node, rhs, var_name, var_type)

def check_boolean_node(node, rhs, var_name, var_type)
  target_node = s(var_type, var_name)
  return unless rhs.lhs == target_node
  operator = rhs.loc.operator.source
  add_offense(node, message: format(MSG, method: operator)) do |corrector|
    autocorrect(corrector, node)
  end
end

def check_send_node(node, rhs, var_name, var_type)

def check_send_node(node, rhs, var_name, var_type)
  return unless OPS.include?(rhs.method_name)
  target_node = s(var_type, var_name)
  return unless rhs.receiver == target_node
  add_offense(node, message: format(MSG, method: rhs.method_name)) do |corrector|
    autocorrect(corrector, node)
  end
end

def on_cvasgn(node)

def on_cvasgn(node)
  check(node, :cvar)
end

def on_ivasgn(node)

def on_ivasgn(node)
  check(node, :ivar)
end

def on_lvasgn(node)

def on_lvasgn(node)
  check(node, :lvar)
end