Class: RuboCop::Cop::Style::ConditionalAssignment

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
ConfigurableEnforcedStyle, ConditionalAssignmentHelper
Defined in:
lib/rubocop/cop/style/conditional_assignment.rb

Overview

Checks for if and case statements where each branch is used for both the assignment and comparison of the same variable when using the return of the condition can be used instead.

Examples:

EnforcedStyle: assign_to_condition (default)

# bad
if foo
  bar = 1
else
  bar = 2
end

case foo
when 'a'
  bar += 1
else
  bar += 2
end

if foo
  some_method
  bar = 1
else
  some_other_method
  bar = 2
end

# good
bar = if foo
        1
      else
        2
      end

bar += case foo
       when 'a'
         1
       else
         2
       end

bar << if foo
         some_method
         1
       else
         some_other_method
         2
       end

EnforcedStyle: assign_inside_condition

# bad
bar = if foo
        1
      else
        2
      end

bar += case foo
       when 'a'
         1
       else
         2
       end

bar << if foo
         some_method
         1
       else
         some_other_method
         2
       end

# good
if foo
  bar = 1
else
  bar = 2
end

case foo
when 'a'
  bar += 1
else
  bar += 2
end

if foo
  some_method
  bar = 1
else
  some_other_method
  bar = 2
end

Constant Summary collapse

MSG =
'Use the return of the conditional for variable assignment and comparison.'
ASSIGN_TO_CONDITION_MSG =
'Assign variables inside of conditionals.'
VARIABLE_ASSIGNMENT_TYPES =
i[casgn cvasgn gvasgn ivasgn lvasgn].freeze
ASSIGNMENT_TYPES =
VARIABLE_ASSIGNMENT_TYPES + i[and_asgn or_asgn op_asgn masgn].freeze
ENABLED =
'Enabled'
SINGLE_LINE_CONDITIONS_ONLY =
'SingleLineConditionsOnly'

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 inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods included from ConfigurableEnforcedStyle

#alternative_style, #alternative_styles, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #style, #style_configured?, #style_detected, #style_parameter_name, #supported_styles, #unexpected_style_detected

Methods included from ConditionalAssignmentHelper

#end_with_eq?, #expand_elses, #expand_when_branches, #indent, #lhs, #tail

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, #always_autocorrect?, autocorrect_incompatible_with, badge, #begin_investigation, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #cop_config, #cop_name, cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, #inspect, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #parser_engine, #ready, #relevant_file?, requires_gem, #string_literals_frozen_by_default?, support_autocorrect?, support_multiple_source?, #target_gem_version, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Method Details

#assignment_type?(node) ⇒ Object

The shovel operator ‘<<` does not have its own type. It is a send type.



222
223
224
225
226
227
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 222

def_node_matcher :assignment_type?, "{\n  \#{ASSIGNMENT_TYPES.join(' ')}\n  (send _recv {:[]= :<< :=~ :!~ :<=> #end_with_eq? :< :>} ...)\n}\n"

#on_case(node) ⇒ Object



258
259
260
261
262
263
264
265
266
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 258

def on_case(node)
  return unless style == :assign_to_condition
  return unless node.else_branch

  when_branches = expand_when_branches(node.when_branches)
  branches = [*when_branches, node.else_branch]

  check_node(node, branches)
end

#on_case_match(node) ⇒ Object



268
269
270
271
272
273
274
275
276
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 268

def on_case_match(node)
  return unless style == :assign_to_condition
  return unless node.else_branch

  in_pattern_branches = expand_when_branches(node.in_pattern_branches)
  branches = [*in_pattern_branches, node.else_branch]

  check_node(node, branches)
end

#on_if(node) ⇒ Object



244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 244

def on_if(node)
  return unless style == :assign_to_condition
  return if node.elsif?

  else_branch = node.else_branch
  elsif_branches, else_branch = expand_elses(else_branch)

  return unless else_branch

  branches = [node.if_branch, *elsif_branches, else_branch]

  check_node(node, branches)
end

#on_send(node) ⇒ Object



238
239
240
241
242
# File 'lib/rubocop/cop/style/conditional_assignment.rb', line 238

def on_send(node)
  return unless assignment_type?(node)

  check_assignment_to_condition(node)
end