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
FOR_LOOP_TYPE =
:for
FOR_LOOP_CHILD_INDEX =
2
NON_FOR_LOOP_TYPES =
LOOP_TYPES - [FOR_LOOP_TYPE]
NON_FOR_LOOP_TYPES_CHILD_INDEX =
1

Instance Method Summary collapse

Instance Method Details

#branch_body_nameObject



86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 86

def branch_body_name
  case branch_point_node.type
  when :if                     then if_body_name
  when :case                   then case_body_name
  when RESCUE_TYPE             then rescue_body_name
  when ENSURE_TYPE             then ensure_body_name
  when *LOGICAL_OPERATOR_TYPES then logical_operator_body_name
  when *LOOP_TYPES             then loop_body_name
  else raise 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.



77
78
79
80
81
82
83
84
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 77

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



56
57
58
59
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 56

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.



67
68
69
70
71
72
73
74
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 67

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



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

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)


33
34
35
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 33

def inside_of_branch?
  branch_point_node
end

#nodeObject



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

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

#run_exclusively_with?(other) ⇒ Boolean

Returns:

  • (Boolean)


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 37

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



29
30
31
# File 'lib/rubocop/cop/variable_force/locatable.rb', line 29

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