Class: RuboCop::Cop::Lint::ShadowedArgument
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
::RuboCop::Cop::Base,
::RuboCop::ExcludeLimit,
NodePattern::Macros,
RuboCop::AST::Sexp
|
|
|
Instance Chain:
self,
::RuboCop::Cop::Base,
::RuboCop::Cop::AutocorrectLogic,
::RuboCop::Cop::IgnoredNode,
::RuboCop::Util,
RuboCop::AST::Sexp
|
|
| Inherits: |
RuboCop::Cop::Base
|
| Defined in: | lib/rubocop/cop/lint/shadowed_argument.rb |
Overview
Checks for shadowed arguments.
This cop has IgnoreImplicitReferences configuration option.
It means argument shadowing is used in order to pass parameters
to zero arity super when IgnoreImplicitReferences is true.
Constant Summary
-
MSG =
# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 67'Argument `%<argument>s` was shadowed by a local variable before it was used.'
::RuboCop::Cop::Base - Inherited
Class Attribute Summary
::RuboCop::Cop::Base - Inherited
| .gem_requirements, .lint?, | |
| .support_autocorrect? | Returns if class supports autocorrect. |
| .support_multiple_source? | Override if your cop should be called repeatedly for multiple investigations Between calls to |
Class Method Summary
::RuboCop::Cop::Base - Inherited
| .autocorrect_incompatible_with | List of cops that should not try to autocorrect at the same time as this cop. |
| .badge | Naming. |
| .callbacks_needed, .cop_name, .department, | |
| .documentation_url | Returns a url to view this cops documentation online. |
| .exclude_from_registry | Call for abstract Cop classes. |
| .inherited, | |
| .joining_forces | Override and return the Force class(es) you need to join. |
| .match? | Returns true if the cop name or the cop namespace matches any of the given names. |
| .new, | |
| .requires_gem | Register a version requirement for the given gem name. |
| .restrict_on_send | |
::RuboCop::ExcludeLimit - Extended
| exclude_limit | Sets up a configuration option to have an exclude limit tracked. |
| transform | |
Instance Attribute Summary
- #ignore_implicit_references? ⇒ Boolean readonly private
::RuboCop::Cop::Base - Inherited
::RuboCop::Cop::AutocorrectLogic - Included
Instance Method Summary
- #after_leaving_scope(scope, _variable_table)
- #uses_var?(node)
-
#argument_references(argument)
private
Get argument references without assignments' references.
-
#assignment_without_argument_usage(argument)
private
Find the first argument assignment, which doesn’t reference the argument at the rhs.
- #check_argument(argument) private
-
#conditional_assignment?(node, stop_search_node) ⇒ Boolean
private
Check whether the given node is always executed or not.
- #reference_pos(node) private
- #shadowing_assignment(argument) private
::RuboCop::Cop::Base - Inherited
| #add_global_offense | Adds an offense that has no particular location. |
| #add_offense | Adds an offense on the specified range (or node with an expression) Unless that offense is disabled for this range, a corrector will be yielded to provide the cop the opportunity to autocorrect the offense. |
| #begin_investigation | Called before any investigation. |
| #callbacks_needed, | |
| #cop_config | Configuration Helpers. |
| #cop_name, #excluded_file?, | |
| #external_dependency_checksum | This method should be overridden when a cop’s behavior depends on state that lives outside of these locations: |
| #inspect, | |
| #message | Gets called if no message is specified when calling |
| #name | Alias for Base#cop_name. |
| #offenses, | |
| #on_investigation_end | Called after all on_… |
| #on_new_investigation | Called before all on_… |
| #on_other_file | Called instead of all on_… |
| #parse | There should be very limited reasons for a Cop to do it’s own parsing. |
| #parser_engine, | |
| #ready | Called between investigations. |
| #relevant_file?, | |
| #target_gem_version | Returns a gems locked versions (i.e. |
| #target_rails_version, #target_ruby_version, #annotate, #apply_correction, #attempt_correction, | |
| #callback_argument | Reserved for Cop::Cop. |
| #complete_investigation | Called to complete an investigation. |
| #correct, #current_corrector, | |
| #current_offense_locations | Reserved for Commissioner: |
| #current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, #file_name_matches_any?, #find_message, #find_severity, #range_for_original, #range_from_node_or_range, | |
| #reset_investigation | Actually private methods. |
| #use_corrector | |
::RuboCop::Cop::AutocorrectLogic - Included
::RuboCop::Cop::IgnoredNode - Included
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Class Method Details
.joining_forces
[ GitHub ]# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 72
def self.joining_forces VariableForce end
Instance Attribute Details
#ignore_implicit_references? ⇒ Boolean (readonly, private)
[ GitHub ]
# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 171
def ignore_implicit_references? cop_config['IgnoreImplicitReferences'] end
Instance Method Details
#after_leaving_scope(scope, _variable_table)
[ GitHub ]# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 76
def after_leaving_scope(scope, _variable_table) scope.variables.each_value { |variable| check_argument(variable) } end
#argument_references(argument) (private)
Get argument references without assignments' references
# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 161
def argument_references(argument) assignment_references = argument.assignments.flat_map(&:references).map(&:source_range) argument.references.reject do |ref| next false unless ref.explicit? assignment_references.include?(ref.node.source_range) end end
#assignment_without_argument_usage(argument) (private)
Find the first argument assignment, which doesn’t reference the argument at the rhs. If the assignment occurs inside a branch or block, it is impossible to tell whether it’s executed, so precise shadowing location is not known.
# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 120
def assignment_without_argument_usage(argument) argument.assignments.reduce(true) do |location_known, assignment| assignment_node = assignment. || assignment.node # Shorthand assignments always use their arguments next false if assignment_node.shorthand_asgn? next false unless assignment_node.parent conditional_assignment = conditional_assignment?(assignment_node.parent, argument.scope.node) unless uses_var?(assignment_node, argument.name) # It's impossible to decide whether a branch or block is executed, # so the precise reassignment location is undecidable. next false if conditional_assignment yield(assignment.node, location_known) break end location_known end end
#check_argument(argument) (private)
[ GitHub ]# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 82
def check_argument(argument) return unless argument.method_argument? || argument.block_argument? # Block local variables, i.e., variables declared after ; inside # |...| aren't really arguments. return if argument.explicit_block_local_variable? shadowing_assignment(argument) do |node| = format(MSG, argument: argument.name) add_offense(node, message: ) end end
#conditional_assignment?(node, stop_search_node) ⇒ Boolean (private)
Check whether the given node is always executed or not
# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 152
def conditional_assignment?(node, stop_search_node) return false if node == stop_search_node node.conditional? || node.type?(:block, :rescue) || conditional_assignment?(node.parent, stop_search_node) end
#reference_pos(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 144
def reference_pos(node) node = node.parent if node.parent.masgn_type? node.source_range.begin_pos end
#shadowing_assignment(argument) (private)
[ GitHub ]# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 95
def shadowing_assignment(argument) return unless argument.referenced? assignment_without_argument_usage(argument) do |node, location_known| assignment_without_usage_pos = node.source_range.begin_pos references = argument_references(argument) # If argument was referenced before it was reassigned # then it's not shadowed next if references.any? do |reference| next true if !reference.explicit? && ignore_implicit_references? reference_pos(reference.node) <= assignment_without_usage_pos end yield location_known ? node : argument.declaration_node end end
#uses_var?(node)
[ GitHub ]# File 'lib/rubocop/cop/lint/shadowed_argument.rb', line 70
def_node_search :uses_var?, '(lvar %)'