class WhoAmI::FindClasses

Public Instance Methods

call(sexp) click to toggle source
# File lib/who_am_i/find_classes.rb, line 10
def call(sexp)
  @current_class = ExtractedClass.new(nil)
  @classes = [@current_class]

  process(sexp)

  @classes.reject { |klass| klass.class_name == "" }
end
handler_missing(node) click to toggle source
# File lib/who_am_i/find_classes.rb, line 49
def handler_missing(node)
  process_children(node)
end
on_class(node) click to toggle source
# File lib/who_am_i/find_classes.rb, line 19
def on_class(node)
  @current_class = classlike_create(node, outerclass: @current_class)
  @classes.push(@current_class)

  process_children(node)

  @current_class = @current_class.outerclass
end
Also aliased as: on_module
on_def(_) click to toggle source

ignore instance method definitions since method definition bodies can't contain class declarations

# File lib/who_am_i/find_classes.rb, line 55
def on_def(_)
end
on_defs(_) click to toggle source

ignore class method definitions since method definition bodies can't contain class declarations

# File lib/who_am_i/find_classes.rb, line 60
def on_defs(_)
end
on_module(node)
Alias for: on_class
on_send(node) click to toggle source
# File lib/who_am_i/find_classes.rb, line 30
def on_send(node)
  receiver, method_name, assigned_node = *node

  if receiver == s(:self) && method_name == :table_name=
    table_name = assigned_node.children.last
    @current_class.table_name = table_name
  end

  if receiver == s(:self) && method_name == :abstract_class=
    abstract_class =
      if assigned_node.type == :true
        true
      else
        false
      end
    @current_class.abstract_class = abstract_class
  end
end
read_and_call(path) click to toggle source
# File lib/who_am_i/find_classes.rb, line 3
def read_and_call(path)
  content = File.read(path)
  sexp = Parser::CurrentRuby.parse(content)

  call(sexp)
end

Private Instance Methods

classlike_create(node, outerclass:) click to toggle source
# File lib/who_am_i/find_classes.rb, line 65
def classlike_create(node, outerclass:)
  class_node, superclass_node, _body_node = *node

  if node.type == :module
    superclass_node = nil
  end

  class_name = resolve_class_name(class_node)
  superclass_name = resolve_class_name(superclass_node)

  classlike = ExtractedClass.new(class_name.to_s)
  classlike.claimed_superclass = superclass_name.to_s
  classlike.outerclass = outerclass

  classlike
end
process_children(node) click to toggle source
# File lib/who_am_i/find_classes.rb, line 92
def process_children(node)
  node.children.each do |child|
    if child.is_a?(AST::Node)
      process(child)
    end
  end

  node
end
resolve_class_name(node) click to toggle source
# File lib/who_am_i/find_classes.rb, line 82
def resolve_class_name(node)
  outer, name = *node

  if outer.nil?
    name
  else
    "#{resolve_class_name(outer)}::#{name}"
  end
end
s(type, *children) click to toggle source
# File lib/who_am_i/find_classes.rb, line 102
def s(type, *children)
  AST::Node.new(type, children)
end