Class: ConstStricter::ConstVisitor

Inherits:
Prism::Visitor
  • Object
show all
Defined in:
lib/const_stricter/const_visitor.rb

Direct Known Subclasses

ScopedConstVisitor

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConstVisitor

Returns a new instance of ConstVisitor.



13
14
15
16
17
# File 'lib/const_stricter/const_visitor.rb', line 13

def initialize
  @const_path = []
  @current_const = ConstName.new
  @const_map = ConstMap.new
end

Instance Attribute Details

#const_mapObject (readonly)

Returns the value of attribute const_map.



7
8
9
# File 'lib/const_stricter/const_visitor.rb', line 7

def const_map
  @const_map
end

Instance Method Details

#visit_child_nodes(node) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/const_stricter/const_visitor.rb', line 46

def visit_child_nodes(node)
  if !@current_const.empty? && !node.is_a?(Prism::ConstantPathNode)
    unless @current_const.parent.dynamic
      # slice возвращает код ноды, включая все дочерние
      # в родительскую цепочку добавляется только самый верхний уровень
      # connection.module::Jobs::ImportProductsJob
      @current_const.unshift(
        ConstNamePart.new(node.slice).tap do |name_part|
          name_part.line_no = node.location.start_line
          name_part.dynamic = true
        end,
      )
    end
    if node.compact_child_nodes.empty?
      # Values()::USER_ID
      @const_map.push(const_path: @const_path, const_name: @current_const)
      @current_const = ConstName.new
    end
  end
  super
end

#visit_constant_path_node(node) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/const_stricter/const_visitor.rb', line 19

def visit_constant_path_node(node)
  if node.compact_child_nodes.empty?
    # include ::ComponentViewPath не вызывает visit_constant_read_node
    visit_constant_read_node(node, force_global_scope: true)
  else
    @current_const.unshift(
      ConstNamePart.new(node.name.to_s).tap do |name_part|
        name_part.line_no = node.location.start_line
      end,
    )
    visit_child_nodes(node)
  end
end

#visit_constant_read_node(node, force_global_scope: false) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/const_stricter/const_visitor.rb', line 36

def visit_constant_read_node(node, force_global_scope: false)
  @current_const.unshift(
    ConstNamePart.new(node.name.to_s).tap do |name_part|
      name_part.line_no = node.location.start_line
    end,
  )
  @const_map.push(const_path: force_global_scope ? EMPTY_ARRAY : @const_path, const_name: @current_const)
  @current_const = ConstName.new
end