Class: RuboCop::Cop::Style::ConditionalAssignment
- Defined in:
- lib/rubocop/cop/style/conditional_assignment.rb
Overview
Check for if and case statements where each branch is used for assignment to the same variable when using the return of the condition can be used instead.
Constant Summary collapse
- MSG =
'Use the return of the conditional for variable assignment ' \ 'and comparison.'.freeze
- ASSIGN_TO_CONDITION_MSG =
'Assign variables inside of conditionals'.freeze
- VARIABLE_ASSIGNMENT_TYPES =
[:casgn, :cvasgn, :gvasgn, :ivasgn, :lvasgn].freeze
- ASSIGNMENT_TYPES =
VARIABLE_ASSIGNMENT_TYPES + [:and_asgn, :or_asgn, :op_asgn].freeze
- IF =
'if'.freeze
- UNLESS =
'unless'.freeze
- LINE_LENGTH =
'Metrics/LineLength'.freeze
- INDENTATION_WIDTH =
'Style/IndentationWidth'.freeze
- ENABLED =
'Enabled'.freeze
- MAX =
'Max'.freeze
- SINGLE_LINE_CONDITIONS_ONLY =
'SingleLineConditionsOnly'.freeze
- WIDTH =
'Width'.freeze
- METHODS =
[:[]=, :<<, :=~, :!~, :<=>].freeze
- CONDITION_TYPES =
[:if, :case].freeze
Constants included from ConditionalAssignmentHelper
RuboCop::Cop::Style::ConditionalAssignmentHelper::ALIGN_WITH, RuboCop::Cop::Style::ConditionalAssignmentHelper::END_ALIGNMENT, RuboCop::Cop::Style::ConditionalAssignmentHelper::EQUAL, RuboCop::Cop::Style::ConditionalAssignmentHelper::KEYWORD
Constants included from Util
Util::ASGN_NODES, Util::BYTE_ORDER_MARK, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES
Instance Attribute Summary
Attributes inherited from Cop
#config, #corrections, #offenses, #processed_source
Instance Method Summary collapse
- #autocorrect(node) ⇒ Object
- #check_assignment_to_condition(node) ⇒ Object
- #on_case(node) ⇒ Object
- #on_if(node) ⇒ Object
- #on_send(node) ⇒ Object
Methods included from IgnoredNode
#ignore_node, #ignored_node?, #part_of_ignored_node?
Methods included from ConfigurableEnforcedStyle
#alternative_style, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #parameter_name, #style, #style_detected, #supported_styles, #unexpected_style_detected
Methods included from ConditionalAssignmentHelper
#expand_elses, #expand_when_branches, #indent, #lhs, #tail
Methods included from IfNode
#elsif?, #if_else?, #if_node_parts, #modifier_if?, #ternary?
Methods inherited from Cop
#add_offense, all, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, #cop_name, cop_name, cop_type, #correct, #debug?, #details, #display_cop_names?, #display_style_guide?, #excluded_file?, #extra_details?, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, non_rails, #parse, qualified_cop_name, #reference_url, #relevant_file?, #style_guide_url, #target_ruby_version
Methods included from Sexp
Methods included from NodePattern::Macros
#def_node_matcher, #def_node_search, #node_search_body
Methods included from AutocorrectLogic
#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #support_autocorrect?
Methods included from Util
begins_its_line?, block_length, comment_line?, directions, double_quotes_acceptable?, double_quotes_required?, effective_column, ends_its_line?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, move_pos, needs_escaping?, numeric_range_size, on_node, operator?, parentheses?, parenthesized_call?, range_with_surrounding_comma, range_with_surrounding_space, source_range, strip_quotes, to_string_literal, to_symbol_literal, within_node?
Methods included from PathUtil
absolute?, match_path?, relative_path
Constructor Details
This class inherits a constructor from RuboCop::Cop::Cop
Instance Method Details
#autocorrect(node) ⇒ Object
267 268 269 270 271 272 273 |
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 267 def autocorrect(node) if assignment_type?(node) move_assignment_inside_condition(node) else move_assignment_outside_condition(node) end end |
#check_assignment_to_condition(node) ⇒ Object
229 230 231 232 233 234 235 236 237 238 239 240 241 |
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 229 def check_assignment_to_condition(node) ignore_node(node) assignment = assignment_node(node) return unless condition?(assignment) _condition, *branches, else_branch = *assignment return unless else_branch # empty else return if single_line_conditions_only? && [*branches, else_branch].any?(&:begin_type?) add_offense(node, :expression, ASSIGN_TO_CONDITION_MSG) end |
#on_case(node) ⇒ Object
256 257 258 259 260 261 262 263 264 265 |
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 256 def on_case(node) return unless style == :assign_to_condition _condition, *when_branches, else_branch = *node return unless else_branch # empty else when_branches = (when_branches) branches = [*when_branches, else_branch] check_node(node, branches) end |
#on_if(node) ⇒ Object
243 244 245 246 247 248 249 250 251 252 253 254 |
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 243 def on_if(node) return unless style == :assign_to_condition return if elsif?(node) _condition, if_branch, else_branch = *node elsif_branches, else_branch = (else_branch) return unless else_branch # empty else branches = [if_branch, *elsif_branches, else_branch] check_node(node, branches) end |
#on_send(node) ⇒ Object
222 223 224 225 226 227 |
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 222 def on_send(node) return unless assignment_type?(node) return unless style == :assign_inside_condition check_assignment_to_condition(node) end |