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_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 130 def allow_multiline_conditions? cop_config['AllowInMultilineConditions'] end
message(node)
click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 118 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 111 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 124 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 require_parentheses?(node, first_child) 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
require_parentheses?(node, condition_body)
click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 96 def require_parentheses?(node, condition_body) return false if !node.while_type? && !node.until_type? return false if !condition_body.block_type? && !condition_body.numblock_type? condition_body.send_node.block_literal? && condition_body.keywords? end
semicolon_separated_expressions?(first_exp, rest_exps)
click to toggle source
# File lib/rubocop/cop/style/parentheses_around_condition.rb, line 103 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