class RuboCop::Cop::VariableForce::Variable
A Variable
represents existence of a local variable. This holds a variable declaration node and some states of the variable.
Constants
- VARIABLE_DECLARATION_TYPES
Attributes
assignments[R]
captured_by_block[R]
captured_by_block?[R]
declaration_node[R]
name[R]
references[R]
scope[R]
Public Class Methods
new(name, declaration_node, scope)
click to toggle source
# File lib/rubocop/cop/variable_force/variable.rb, line 16 def initialize(name, declaration_node, scope) unless VARIABLE_DECLARATION_TYPES.include?(declaration_node.type) raise ArgumentError, "Node type must be any of #{VARIABLE_DECLARATION_TYPES}, " \ "passed #{declaration_node.type}" end @name = name.to_sym @declaration_node = declaration_node @scope = scope @assignments = [] @references = [] @captured_by_block = false end
Public Instance Methods
argument?()
click to toggle source
# File lib/rubocop/cop/variable_force/variable.rb, line 82 def argument? ARGUMENT_DECLARATION_TYPES.include?(@declaration_node.type) end
assign(node)
click to toggle source
# File lib/rubocop/cop/variable_force/variable.rb, line 32 def assign(node) @assignments << Assignment.new(node, self) end
block_argument?()
click to toggle source
# File lib/rubocop/cop/variable_force/variable.rb, line 90 def block_argument? argument? && @scope.node.block_type? end
capture_with_block!()
click to toggle source
rubocop:enable Metrics/AbcSize
# File lib/rubocop/cop/variable_force/variable.rb, line 62 def capture_with_block! @captured_by_block = true end
explicit_block_local_variable?()
click to toggle source
# File lib/rubocop/cop/variable_force/variable.rb, line 98 def explicit_block_local_variable? @declaration_node.shadowarg_type? end
keyword_argument?()
click to toggle source
# File lib/rubocop/cop/variable_force/variable.rb, line 94 def keyword_argument? %i[kwarg kwoptarg].include?(@declaration_node.type) end
method_argument?()
click to toggle source
# File lib/rubocop/cop/variable_force/variable.rb, line 86 def method_argument? argument? && %i[def defs].include?(@scope.node.type) end
reference!(node)
click to toggle source
rubocop:disable Metrics/AbcSize
# File lib/rubocop/cop/variable_force/variable.rb, line 41 def reference!(node) reference = Reference.new(node, @scope) @references << reference consumed_branches = Set.new @assignments.reverse_each do |assignment| next if consumed_branches.include?(assignment.branch) unless assignment.run_exclusively_with?(reference) assignment.reference!(node) end break if !assignment.branch || assignment.branch == reference.branch unless assignment.branch.may_run_incompletely? consumed_branches << assignment.branch end end end
referenced?()
click to toggle source
# File lib/rubocop/cop/variable_force/variable.rb, line 36 def referenced? !@references.empty? end
should_be_unused?()
click to toggle source
# File lib/rubocop/cop/variable_force/variable.rb, line 78 def should_be_unused? name.to_s.start_with?('_') end
used?()
click to toggle source
This is a convenient way to check whether the variable is used in its entire variable lifetime. For
more precise usage check, refer Assignment#used?
.
Once the variable is captured by a block, we have no idea when, where, and how many times the block would be invoked. This means we cannot track the usage of the variable. So we consider it's used to suppress false positive offenses.
# File lib/rubocop/cop/variable_force/variable.rb, line 74 def used? @captured_by_block || referenced? end