Class: RuboCop::Cop::Lint::ShadowingOuterLocalVariable

Inherits:
Base
  • Object
show all
Defined in:
lib/rubocop/cop/lint/shadowing_outer_local_variable.rb

Overview

Checks for the use of local variable names from an outer scope in block arguments or block-local variables. This mirrors the warning given by ‘ruby -cw` prior to Ruby 2.6: “shadowing outer local variable - foo”.

The cop is now disabled by default to match the upstream Ruby behavior. It’s useful, however, if you’d like to avoid shadowing variables from outer scopes, which some people consider an anti-pattern that makes it harder to keep track of what’s going on in a program.

NOTE: Shadowing of variables in block passed to ‘Ractor.new` is allowed because `Ractor` should not access outer variables. eg. following style is encouraged:

source,ruby

worker_id, pipe = env Ractor.new(worker_id, pipe) do |worker_id, pipe| end


Examples:


# bad
def some_method
  foo = 1

  2.times do |foo| # shadowing outer `foo`
    do_something(foo)
  end
end

# good
def some_method
  foo = 1

  2.times do |bar|
    do_something(bar)
  end
end

Constant Summary collapse

MSG =
'Shadowing outer local variable - `%<variable>s`.'

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Class Method Summary collapse

Instance Method Summary collapse

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, 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

Class Method Details

.joining_forcesObject



54
55
56
# File 'lib/rubocop/cop/lint/shadowing_outer_local_variable.rb', line 54

def self.joining_forces
  VariableForce
end

Instance Method Details

#before_declaring_variable(variable, variable_table) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/rubocop/cop/lint/shadowing_outer_local_variable.rb', line 58

def before_declaring_variable(variable, variable_table)
  return if variable.should_be_unused?
  return if ractor_block?(variable.scope.node)

  outer_local_variable = variable_table.find_variable(variable.name)
  return unless outer_local_variable
  return if variable_used_in_declaration_of_outer?(variable, outer_local_variable)
  return if same_conditions_node_different_branch?(variable, outer_local_variable)

  message = format(MSG, variable: variable.name)
  add_offense(variable.declaration_node, message: message)
end

#ractor_block?(node) ⇒ Object



50
51
52
# File 'lib/rubocop/cop/lint/shadowing_outer_local_variable.rb', line 50

def_node_matcher :ractor_block?, <<~PATTERN
  (block (send (const nil? :Ractor) :new ...) ...)
PATTERN