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_class(node)
Alias for: on_module
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