Class: Hone::MethodMap::MethodExtractor

Inherits:
Prism::Visitor
  • Object
show all
Defined in:
lib/hone/method_map.rb

Overview

Internal visitor for extracting methods from Prism AST

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file_path) ⇒ MethodExtractor

Returns a new instance of MethodExtractor.



68
69
70
71
72
73
# File 'lib/hone/method_map.rb', line 68

def initialize(file_path)
  @file_path = file_path
  @methods = []
  @context_stack = []
  super()
end

Instance Attribute Details

#methodsObject (readonly)

Returns the value of attribute methods.



66
67
68
# File 'lib/hone/method_map.rb', line 66

def methods
  @methods
end

Instance Method Details

#visit_class_node(node) ⇒ Object



75
76
77
78
79
80
# File 'lib/hone/method_map.rb', line 75

def visit_class_node(node)
  class_name = extract_constant_name(node.constant_path)
  @context_stack.push(class_name)
  super
  @context_stack.pop
end

#visit_def_node(node) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/hone/method_map.rb', line 89

def visit_def_node(node)
  method_name = node.name.to_s
  class_name = @context_stack.any? ? @context_stack.join("::") : nil

  @methods << MethodInfo.new(
    name: method_name,
    class_name: class_name,
    file: @file_path,
    start_line: node.location.start_line,
    end_line: node.location.end_line
  )

  super
end

#visit_module_node(node) ⇒ Object



82
83
84
85
86
87
# File 'lib/hone/method_map.rb', line 82

def visit_module_node(node)
  module_name = extract_constant_name(node.constant_path)
  @context_stack.push(module_name)
  super
  @context_stack.pop
end

#visit_singleton_method_node(node) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/hone/method_map.rb', line 104

def visit_singleton_method_node(node)
  method_name = "self.#{node.name}"
  class_name = @context_stack.any? ? @context_stack.join("::") : nil

  @methods << MethodInfo.new(
    name: method_name,
    class_name: class_name,
    file: @file_path,
    start_line: node.location.start_line,
    end_line: node.location.end_line
  )

  super
end