class RuboCop::Cop::Style::ParenthesesAroundCondition

Checks for the presence of superfluous parentheses around the condition of if/unless/while/until.

`AllowSafeAssignment` option for safe assignment. By safe assignment we mean putting parentheses around an assignment to indicate “I know I'm using an assignment as a condition. It's not a mistake.”

@example

# bad
x += 1 while (x < 10)
foo unless (bar || baz)

if (x > 10)
elsif (x < 3)
end

# good
x += 1 while x < 10
foo unless bar || baz

if x > 10
elsif x < 3
end

@example AllowSafeAssignment: true (default)

# good
foo unless (bar = baz)

@example AllowSafeAssignment: false

# bad
foo unless (bar = baz)

@example AllowInMultilineConditions: false (default)

# bad
if (x > 10 &&
   y > 10)
end

# good
 if x > 10 &&
    y > 10
 end

@example AllowInMultilineConditions: true

# good
if (x > 10 &&
   y > 10)
end

Public Instance Methods

on_if(node) click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 62
def on_if(node)
  return if node.ternary?

  process_control_op(node)
end
on_until(node)
Alias for: on_while
on_while(node) click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 68
def on_while(node)
  process_control_op(node)
end
Also aliased as: on_until

Private Instance Methods

allow_multiline_conditions?() click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 122
def allow_multiline_conditions?
  cop_config['AllowInMultilineConditions']
end
message(node) click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 110
def message(node)
  kw = node.parent.keyword
  article = kw == 'while' ? 'a' : 'an'
  "Don't use parentheses around the condition of #{article} `#{kw}`."
end
modifier_op?(node) click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 103
def modifier_op?(node)
  return false if node.if_type? && node.ternary?
  return true if node.rescue_type?

  node.basic_conditional? && node.modifier_form?
end
parens_allowed?(node) click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 116
def parens_allowed?(node)
  parens_required?(node) ||
    (safe_assignment?(node) && safe_assignment_allowed?) ||
    (node.multiline? && allow_multiline_conditions?)
end
process_control_op(node) click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 80
def process_control_op(node)
  cond = node.condition

  control_op_condition(cond) do |first_child, rest_children|
    return if semicolon_separated_expressions?(first_child, rest_children)
    return if modifier_op?(first_child)
    return if parens_allowed?(cond)

    message = message(cond)
    add_offense(cond, message: message) do |corrector|
      ParenthesesCorrector.correct(corrector, cond)
    end
  end
end
semicolon_separated_expressions?(first_exp, rest_exps) click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 95
def semicolon_separated_expressions?(first_exp, rest_exps)
  return false unless (second_exp = rest_exps.first)

  range = range_between(first_exp.source_range.end_pos, second_exp.source_range.begin_pos)

  range.source.include?(';')
end