class RuboCop::Cop::Lint::AssignmentInCondition

This cop checks for assignments in the conditions of if/while/until.

@example

# bad

if some_var = true
  do_something
end

@example

# good

if some_var == true
  do_something
end

Constants

ASGN_TYPES
MSG_WITHOUT_SAFE_ASSIGNMENT_ALLOWED
MSG_WITH_SAFE_ASSIGNMENT_ALLOWED

Public Instance Methods

on_if(node) click to toggle source
# File lib/rubocop/cop/lint/assignment_in_condition.rb, line 36
def on_if(node)
  return if node.condition.block_type?

  traverse_node(node.condition, ASGN_TYPES) do |asgn_node|
    next :skip_children if skip_children?(asgn_node)
    next if allowed_construct?(asgn_node)

    add_offense(asgn_node, location: :operator)
  end
end
Also aliased as: on_while, on_until
on_until(node)
Alias for: on_if
on_while(node)
Alias for: on_if

Private Instance Methods

allowed_construct?(asgn_node) click to toggle source
# File lib/rubocop/cop/lint/assignment_in_condition.rb, line 59
def allowed_construct?(asgn_node)
  asgn_node.begin_type? || conditional_assignment?(asgn_node)
end
conditional_assignment?(asgn_node) click to toggle source
# File lib/rubocop/cop/lint/assignment_in_condition.rb, line 63
def conditional_assignment?(asgn_node)
  !asgn_node.loc.operator
end
message(_node) click to toggle source
# File lib/rubocop/cop/lint/assignment_in_condition.rb, line 51
def message(_node)
  if safe_assignment_allowed?
    MSG_WITH_SAFE_ASSIGNMENT_ALLOWED
  else
    MSG_WITHOUT_SAFE_ASSIGNMENT_ALLOWED
  end
end
skip_children?(asgn_node) click to toggle source
# File lib/rubocop/cop/lint/assignment_in_condition.rb, line 67
def skip_children?(asgn_node)
  (asgn_node.send_type? && !asgn_node.assignment_method?) ||
    empty_condition?(asgn_node) ||
    (safe_assignment_allowed? && safe_assignment?(asgn_node))
end
traverse_node(node, types) { |node| ... } click to toggle source

each_node/visit_descendants_with_types with :skip_children

# File lib/rubocop/cop/lint/assignment_in_condition.rb, line 74
def traverse_node(node, types, &block)
  result = yield node if types.include?(node.type)

  return if result == :skip_children

  node.each_child_node { |child| traverse_node(child, types, &block) }
end