Class: Spektr::Targets::Base

Inherits:
Prism::Visitor
  • Object
show all
Defined in:
lib/spektr/targets/base.rb

Direct Known Subclasses

Config, Controller, Model, Routes, View

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, content) ⇒ Base

Returns a new instance of Base.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/spektr/targets/base.rb', line 6

def initialize(path, content)
  Spektr.logger.debug "loading #{path}"
  @ast = Prism.parse(content)
  @path = path
  return unless @ast
  @parent = ""
  @parent_modules = []
  @methods = []
  @lvars = []
  @ivars = []
  @calls = []
  @interpolated_xstrings = []
  @ast.value.accept(self)
  @name = @path.split('/').last if @name&.blank?
  @name = @name.prepend("#{@parent_modules.map(&:name).join('::')}::") if @name && @parent_modules.any?
end

Instance Attribute Details

#astObject

Returns the value of attribute ast.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def ast
  @ast
end

#callsObject

Returns the value of attribute calls.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def calls
  @calls
end

#interpolated_xstringsObject

Returns the value of attribute interpolated_xstrings.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def interpolated_xstrings
  @interpolated_xstrings
end

#lvarsObject

Returns the value of attribute lvars.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def lvars
  @lvars
end

#methodsObject

Returns the value of attribute methods.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def methods
  @methods
end

#nameObject

Returns the value of attribute name.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def name
  @name
end

#optionsObject

Returns the value of attribute options.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def options
  @options
end

#parentObject

Returns the value of attribute parent.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def parent
  @parent
end

#parent_modulesObject

Returns the value of attribute parent_modules.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def parent_modules
  @parent_modules
end

#pathObject

Returns the value of attribute path.



4
5
6
# File 'lib/spektr/targets/base.rb', line 4

def path
  @path
end

Instance Method Details

#find_calls(name, receiver = nil) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/spektr/targets/base.rb', line 31

def find_calls(name, receiver = nil)
  if name.is_a? Regexp
    operator = :=~
  else
    operator = :==
  end
  @calls.select do |node|
    if receiver.nil?
      node.name.send(operator, name)
    elsif receiver == false
      node.name.send(operator, name) && node.receiver.nil?
    else
      node_receiver = node.receiver.name if node.receiver.respond_to?(:name)
      if node.receiver.respond_to?(:parent) && node.receiver.parent
        node_receiver = node_receiver.to_s.prepend("#{node.receiver.parent.name}::").to_sym
      end
      node.name.send(operator, name) && node.receiver && receiver == node_receiver
    end
  end
end

#find_calls_with_block(name, _receiver = nil) ⇒ Object



52
53
54
55
56
# File 'lib/spektr/targets/base.rb', line 52

def find_calls_with_block(name, _receiver = nil)
  find_calls(name).select do |call|
    call.block
  end
end

#find_method(name) ⇒ Object



58
59
60
# File 'lib/spektr/targets/base.rb', line 58

def find_method(name)
  @methods.find{|method| method.name == name }
end

#find_methods(node:, visibility: :all) ⇒ Object



62
63
64
# File 'lib/spektr/targets/base.rb', line 62

def find_methods(node:, visibility: :all)
  Spektr::Extractors::Methods.new(visibility:).call(node).result
end

#method_definitionsObject



23
24
25
# File 'lib/spektr/targets/base.rb', line 23

def method_definitions
  @method_definitions ||= find_methods(node: @ast)
end

#public_methodsObject



27
28
29
# File 'lib/spektr/targets/base.rb', line 27

def public_methods
  @public_methods ||= find_methods(node: @ast, visibility: :public)
end

#visit_call_node(node) ⇒ Object



67
68
69
70
# File 'lib/spektr/targets/base.rb', line 67

def visit_call_node(node)
  @calls << node
  super
end

#visit_class_node(node) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/spektr/targets/base.rb', line 72

def visit_class_node(node)
  @name = node.name.to_s
  case node.superclass
  when Prism::CallNode
    @parent = node.superclass.receiver.name.to_s
  when Prism::ConstantPathNode, Prism::ConstantReadNode
    @parent = node.superclass.name.to_s
    @parent.prepend("#{node.superclass.parent.name}::") if node.superclass.respond_to?(:parent)
    if node.superclass.respond_to?(:parent) && node.superclass.parent.respond_to?(:parent)
      @parent.prepend("#{node.superclass.parent.parent.name}::")
    end
  end
  if node.is_a?(Prism::ClassNode) && node.constant_path && node.constant_path.respond_to?(:parent)
    @parent = node.constant_path.parent.name.to_s
  end
  @parent = @parent.prepend("#{@parent_modules.map(&:name).join('::')}::") if @parent_modules.any?
  super
end

#visit_def_node(node) ⇒ Object



97
98
99
100
# File 'lib/spektr/targets/base.rb', line 97

def visit_def_node(node)
  @methods << node
  super
end

#visit_instance_variable_write_node(node) ⇒ Object



112
113
114
115
# File 'lib/spektr/targets/base.rb', line 112

def visit_instance_variable_write_node(node)
  @ivars << node
  super
end

#visit_interpolated_x_string_node(node) ⇒ Object



102
103
104
105
# File 'lib/spektr/targets/base.rb', line 102

def visit_interpolated_x_string_node(node)
  @interpolated_xstrings << node
  super
end

#visit_local_variable_write_node(node) ⇒ Object



107
108
109
110
# File 'lib/spektr/targets/base.rb', line 107

def visit_local_variable_write_node(node)
  @lvars << node
  super
end

#visit_module_node(node) ⇒ Object



91
92
93
94
95
# File 'lib/spektr/targets/base.rb', line 91

def visit_module_node(node)
  @parent_modules << node.constant_path.parent.name if node.constant_path && node.constant_path.respond_to?(:parent)
  @parent_modules << node
  super
end