class MethodLog::MethodFinder
Attributes
methods[R]
Public Class Methods
new(source_file)
click to toggle source
# File lib/method_log/method_finder.rb, line 12 def initialize(source_file) @source_file = source_file @scope = Scope::Root.new @methods = {} ast = Parser::CurrentRuby.parse(source_file.source) process(ast) end
Public Instance Methods
find(method_identifier)
click to toggle source
# File lib/method_log/method_finder.rb, line 20 def find(method_identifier) @methods[method_identifier] end
on_def(node)
click to toggle source
Calls superclass method
# File lib/method_log/method_finder.rb, line 38 def on_def(node) name, args_node, body_node = *node record_method_definition(@scope, name, node) super end
on_defs(node)
click to toggle source
Calls superclass method
# File lib/method_log/method_finder.rb, line 44 def on_defs(node) definee_node, name, args_node, body_node = *node scope = singleton_scope_for(definee_node) record_method_definition(scope, name, node) super end
on_module(node)
click to toggle source
Calls superclass method
# File lib/method_log/method_finder.rb, line 24 def on_module(node) const_node = node.children.first constants = process_const(const_node) new_constant = constants.pop with_scope(@scope.for(constants).define(new_constant)) { super } end
Also aliased as: on_class
on_sclass(node)
click to toggle source
Calls superclass method
# File lib/method_log/method_finder.rb, line 33 def on_sclass(node) target_node = node.children.first with_scope(singleton_scope_for(target_node)) { super } end
Private Instance Methods
lines_for(node)
click to toggle source
# File lib/method_log/method_finder.rb, line 75 def lines_for(node) expression = node.location.expression first_line = expression.line - 1 last_line = expression.source_buffer.decompose_position(expression.end_pos).first - 1 first_line..last_line end
process_const(node, namespaces = [])
click to toggle source
# File lib/method_log/method_finder.rb, line 65 def process_const(node, namespaces = []) scope_node, name = *node namespace = (node.type == :cbase) ? :root : name namespaces.unshift(namespace) if scope_node process_const(scope_node, namespaces) end namespaces end
record_method_definition(scope, name, node)
click to toggle source
# File lib/method_log/method_finder.rb, line 82 def record_method_definition(scope, name, node) definition = MethodDefinition.new(@source_file, lines_for(node)) identifier = scope.method_identifier(name) @methods[identifier] = definition end
singleton_scope_for(node)
click to toggle source
# File lib/method_log/method_finder.rb, line 53 def singleton_scope_for(node) case node.type when :self @scope.singleton when :const constants = process_const(node) @scope.for(constants).singleton else @scope.define(node.inspect).singleton end end
with_scope(scope) { || ... }
click to toggle source
# File lib/method_log/method_finder.rb, line 88 def with_scope(scope, &block) @scope = scope yield ensure @scope = scope.parent end