class CodeExplorer::Consts

Attributes

cb[R]

@return [ConstBinding]

superclasses[R]

@return [Hash{String => Array<String>}]

Public Class Methods

new() click to toggle source
# File lib/code_explorer/consts.rb, line 12
def initialize
  @cb = ConstBinding.new("")
  @superclasses = {}
end

Public Instance Methods

const_name_from_sexp(node) click to toggle source
# File lib/code_explorer/consts.rb, line 23
def const_name_from_sexp(node)
  case node.type
  when :self
    "self"
  when :cbase
    ""
  when :const, :casgn
    parent, name, _maybe_value = *node
    if parent
      const_name_from_sexp(parent) + "::#{name}"
    else
      name.to_s
    end
  else
    raise "Unexpected #{node.type}"
  end
end
new_scope(name, &block) click to toggle source
# File lib/code_explorer/consts.rb, line 41
def new_scope(name, &block)
  @cb = cb.open_namespace(name)
  block.call
  @cb = cb.close_namespace
end
on_casgn(node) click to toggle source
# File lib/code_explorer/consts.rb, line 84
def on_casgn(node)
  name = cb.resolve_declared_const(const_name_from_sexp(node))
  cb.declare_const(name)
  #    puts "casgn #{name}"
end
on_class(node) click to toggle source
Calls superclass method
# File lib/code_explorer/consts.rb, line 57
def on_class(node)
  name, parent, _body = *node
  parent ||= s(:const, s(:cbase), :Object)

  name   = cb.resolve_declared_const(const_name_from_sexp(name))
  parent = cb.resolve_used_const(const_name_from_sexp(parent))
  #    puts "class #{name} < #{parent}"

  @superclasses[name] = [parent]

  new_scope(name) do
    super
  end
end
on_const(node) click to toggle source
# File lib/code_explorer/consts.rb, line 90
def on_const(node)
  name = const_name_from_sexp(node)
  fqname = cb.resolve_used_const(name)
  #    puts "CONST #{fqname}"
end
on_module(node) click to toggle source
Calls superclass method
# File lib/code_explorer/consts.rb, line 47
def on_module(node)
  name, _body = *node
  name = cb.resolve_declared_const(const_name_from_sexp(name))
  #    puts "module #{name}"

  new_scope(name) do
    super
  end
end
on_sclass(node) click to toggle source
Calls superclass method
# File lib/code_explorer/consts.rb, line 72
def on_sclass(node)
  parent, _body = *node

  parent = const_name_from_sexp(parent)
  name = "<< #{parent}" # cheating
  #    puts "class #{name}"

  new_scope(name) do
    super
  end
end
report_modules(asts) click to toggle source
# File lib/code_explorer/consts.rb, line 17
def report_modules(asts)
  Array(asts).each do |ast|
    process(ast)
  end
end