Class: Rubocop::Cop::VariableInspector::Variable

Inherits:
Object
  • Object
show all
Defined in:
lib/rubocop/cop/variable_inspector/variable.rb

Overview

A Variable represents existance of a local variable. This holds a variable declaration node, and some states of the variable.

Constant Summary collapse

VARIABLE_DECLARATION_TYPES =
(VARIABLE_ASSIGNMENT_TYPES + DECLARATION_TYPES).freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, declaration_node, scope) ⇒ Variable

Returns a new instance of Variable.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 17

def initialize(name, declaration_node, scope)
  unless VARIABLE_DECLARATION_TYPES.include?(declaration_node.type)
    fail 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 = []
  @captured_by_block = false
end

Instance Attribute Details

#assignmentsObject (readonly)

Returns the value of attribute assignments.



13
14
15
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 13

def assignments
  @assignments
end

#captured_by_blockObject (readonly) Also known as: captured_by_block?

Returns the value of attribute captured_by_block.



13
14
15
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 13

def captured_by_block
  @captured_by_block
end

#declaration_nodeObject (readonly)

Returns the value of attribute declaration_node.



13
14
15
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 13

def declaration_node
  @declaration_node
end

#nameObject (readonly)

Returns the value of attribute name.



13
14
15
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 13

def name
  @name
end

#scopeObject (readonly)

Returns the value of attribute scope.



13
14
15
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 13

def scope
  @scope
end

Instance Method Details

#assign(node) ⇒ Object



32
33
34
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 32

def assign(node)
  @assignments << Assignment.new(node, self)
end

#block_local_variable?Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 81

def block_local_variable?
  @declaration_node.type == BLOCK_LOCAL_VARIABLE_DECLARATION_TYPE
end

#capture_with_block!Object



61
62
63
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 61

def capture_with_block!
  @captured_by_block = true
end

#method_argument?Boolean

Returns:

  • (Boolean)


77
78
79
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 77

def method_argument?
  METHOD_ARGUMENT_DECLARATION_TYPES.include?(@declaration_node.type)
end

#reference!(node) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 40

def reference!(node)
  reference = Reference.new(node, @scope)
  consumed_branch_ids = Set.new

  @assignments.reverse_each do |assignment|
    next if consumed_branch_ids.include?(assignment.branch_id)

    assignment.reference!

    if assignment.inside_of_branch?
      break if assignment.branch_id == reference.branch_id

      unless assignment.reference_penetrable?
        consumed_branch_ids << assignment.branch_id
      end
    else
      break
    end
  end
end

#referenced?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 36

def referenced?
  @assignments.any?(&:referenced?)
end

#used?Boolean

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 and it means we cannot track the usage of the variable. So we consider it's used to suppress false positive offences.

Returns:

  • (Boolean)


73
74
75
# File 'lib/rubocop/cop/variable_inspector/variable.rb', line 73

def used?
  @captured_by_block || referenced?
end