Class: Spektr::Targets::Base
- Inherits:
-
Prism::Visitor
- Object
- Prism::Visitor
- Spektr::Targets::Base
show all
- Defined in:
- lib/spektr/targets/base.rb
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
#ast ⇒ Object
Returns the value of attribute ast.
4
5
6
|
# File 'lib/spektr/targets/base.rb', line 4
def ast
@ast
end
|
#calls ⇒ Object
Returns the value of attribute calls.
4
5
6
|
# File 'lib/spektr/targets/base.rb', line 4
def calls
@calls
end
|
#interpolated_xstrings ⇒ Object
Returns the value of attribute interpolated_xstrings.
4
5
6
|
# File 'lib/spektr/targets/base.rb', line 4
def interpolated_xstrings
@interpolated_xstrings
end
|
#lvars ⇒ Object
Returns the value of attribute lvars.
4
5
6
|
# File 'lib/spektr/targets/base.rb', line 4
def lvars
@lvars
end
|
#methods ⇒ Object
Returns the value of attribute methods.
4
5
6
|
# File 'lib/spektr/targets/base.rb', line 4
def methods
@methods
end
|
#name ⇒ Object
Returns the value of attribute name.
4
5
6
|
# File 'lib/spektr/targets/base.rb', line 4
def name
@name
end
|
#options ⇒ Object
Returns the value of attribute options.
4
5
6
|
# File 'lib/spektr/targets/base.rb', line 4
def options
@options
end
|
#parent ⇒ Object
Returns the value of attribute parent.
4
5
6
|
# File 'lib/spektr/targets/base.rb', line 4
def parent
@parent
end
|
#parent_modules ⇒ Object
Returns the value of attribute parent_modules.
4
5
6
|
# File 'lib/spektr/targets/base.rb', line 4
def parent_modules
@parent_modules
end
|
#path ⇒ Object
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_definitions ⇒ Object
23
24
25
|
# File 'lib/spektr/targets/base.rb', line 23
def method_definitions
@method_definitions ||= find_methods(node: @ast)
end
|
#public_methods ⇒ Object
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
|