Class: RuboCop::Cop::InternalAffairs::NodePatternGroups::ASTWalker

Inherits:
Object
  • Object
show all
Defined in:
lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb

Overview

Walks an AST that has been processed by ‘InternalAffairs::NodePatternGroups::Processor` in order to find `node_type` and `node_sequence` nodes that can be replaced with a node group in `InternalAffairs/NodePatternGroups`.

Calling ‘ASTWalker#walk` sets `node_groups` with an array of `NodeGroup` structs that contain metadata about nodes that can be replaced, including location data. That metadata is used by the cop to register offenses and perform corrections.

Defined Under Namespace

Classes: NodeGroup

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeASTWalker

Returns a new instance of ASTWalker.



30
31
32
# File 'lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb', line 30

def initialize
  reset!
end

Instance Attribute Details

#node_groupsObject (readonly)

Returns the value of attribute node_groups.



38
39
40
# File 'lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb', line 38

def node_groups
  @node_groups
end

Instance Method Details

#on_union(node) ⇒ Object

Search ‘union` nodes for `node_type` and `node_sequence` nodes that can be collapsed into a node group.

  • ‘node_type` nodes are nodes with no further configuration (ie. `send`)

  • ‘node_sequence` nodes are nodes with further configuration (ie. `(send …)`)

Each group of types that can be collapsed will have a ‘NodeGroup` record added to `node_groups`, which is then used by the cop.



59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb', line 59

def on_union(node)
  all_node_types = each_child_node(node, :node_type, :node_sequence).to_a

  each_node_group(all_node_types) do |group_name, node_types|
    next unless sequences_match?(node_types)

    node_groups << node_group_data(
      group_name, node, node_types,
      all_node_types.index(node_types.first),
      (node.children - node_types).any?
    )
  end
end

#reset!Object



34
35
36
# File 'lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb', line 34

def reset!
  @node_groups = []
end

#walk(node) ⇒ Object

Recursively walk the AST in a depth-first manner. Only ‘union` nodes are handled further.



42
43
44
45
46
47
48
49
50
# File 'lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb', line 42

def walk(node)
  return if node.nil?

  on_union(node) if node.type == :union

  node.child_nodes.each do |child|
    walk(child)
  end
end