Module: RuboCop::Cop::VariableForce::Locatable

Included in:
Assignment, Reference
Defined in:
lib/rubocop/cop/variable_force/locatable.rb

Overview

This module provides a way to locate the conditional branch the node is in. This is intended to be used as mix-in.

Defined Under Namespace

Classes: InvalidBranchBodyError

Constant Summary collapse

BRANCH_TYPES =
[:if, :case].freeze
CONDITION_INDEX_OF_BRANCH_NODE =
0
LOGICAL_OPERATOR_TYPES =
[:and, :or].freeze
LEFT_SIDE_INDEX_OF_LOGICAL_OPERATOR_NODE =
0
ENSURE_TYPE =
:ensure
ENSURE_INDEX_OF_ENSURE_NODE =
1

Instance Method Summary collapse

Instance Method Details

#branch_body_nameObject



79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 79

def branch_body_name
  case branch_point_node.type
  when :if                     then if_body_name
  when :case                   then case_body_name
  when *LOGICAL_OPERATOR_TYPES then logical_operator_body_name
  when RESCUE_TYPE             then rescue_body_name
  when ENSURE_TYPE             then ensure_body_name
  else fail InvalidBranchBodyError
  end
rescue InvalidBranchBodyError
  raise InvalidBranchBodyError,
        "Invalid body index #{body_index} of #{branch_point_node.type}"
end

#branch_body_nodeObject

A child node of #branch_point_node this assignment belongs.



70
71
72
73
74
75
76
77
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 70

def branch_body_node
  if instance_variable_defined?(:@branch_body_node)
    return @branch_body_node
  end

  set_branch_point_and_body_nodes!
  @branch_body_node
end

#branch_idObject



49
50
51
52
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 49

def branch_id
  return nil unless inside_of_branch?
  @branch_id ||= [branch_point_node.object_id, branch_type].join('_')
end

#branch_point_nodeObject

Inner if, case, rescue, or ensure node.



60
61
62
63
64
65
66
67
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 60

def branch_point_node
  if instance_variable_defined?(:@branch_point_node)
    return @branch_point_node
  end

  set_branch_point_and_body_nodes!
  @branch_point_node
end

#branch_typeObject



54
55
56
57
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 54

def branch_type
  return nil unless inside_of_branch?
  @branch_type ||= [branch_point_node.type, branch_body_name].join('_')
end

#inside_of_branch?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 26

def inside_of_branch?
  branch_point_node
end

#nodeObject



18
19
20
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 18

def node
  fail '#node must be declared!'
end

#run_exclusively_with?(other) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 30

def run_exclusively_with?(other)
  return false unless branch_point_node.equal?(other.branch_point_node)
  return false if branch_body_node.equal?(other.branch_body_node)

  # Main body of rescue is always run:
  #
  #   begin
  #     # main
  #   rescue
  #     # resbody
  #   end
  if branch_point_node.type == :rescue &&
     (branch_body_name == 'main' || other.branch_body_name == 'main')
    return false
  end

  true
end

#scopeObject



22
23
24
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 22

def scope
  fail '#scope must be declared!'
end