class Depdump::Tracer
Attributes
classes[R]
registry_tree[R]
relations[R]
Public Class Methods
new()
click to toggle source
# File lib/depdump/tracer.rb, line 5 def initialize @registry_tree = Registry::Tree.new @context = @registry_tree.root end
Public Instance Methods
trace_node(node, namespaces = [])
click to toggle source
# File lib/depdump/tracer.rb, line 10 def trace_node(node, namespaces = []) return unless node.respond_to?(:type) case node.type when :class, :module trace_class(node, namespaces) when :const trace_const(node, namespaces) else node.children.map { |n| trace_node(n, namespaces) } end end
Private Instance Methods
expand_const_namespaces(node, namespaces)
click to toggle source
returns [nil] if node.type is :cbase
# File lib/depdump/tracer.rb, line 64 def expand_const_namespaces(node, namespaces) valid_definition = node.respond_to?(:type) && [:const, :cbase].include?(node.type) return namespaces unless valid_definition maybe_qualifing_node = node.children.first qualified_namespaces = expand_const_namespaces(maybe_qualifing_node, namespaces) qualified_namespaces + [node.children.last] end
stack_context(namespaces) { || ... }
click to toggle source
# File lib/depdump/tracer.rb, line 54 def stack_context(namespaces) prev_context = @context @context = @registry_tree.find_or_create_node(namespaces, prev_context) yield @context = prev_context end
trace_class(node, namespaces)
click to toggle source
# File lib/depdump/tracer.rb, line 25 def trace_class(node, namespaces) definition_node = node.children.first # definition_node.type should be :const (otherwise syntax error occurs) defined_namespaces = expand_const_namespaces(definition_node, namespaces) # Assume as top level definition is the rest of the array after last nil (cbase) appeared # e.g.) [nil, :A, nil, :B] => [:B] if cbase_index = defined_namespaces.rindex(nil) namespaces_size_from_top = defined_namespaces.size - (cbase_index + 1) defined_namespaces = defined_namespaces.last(namespaces_size_from_top) end stack_context(defined_namespaces) do node.children[1..-1].each { |n| trace_node(n, defined_namespaces) } end end
trace_const(node, namespaces)
click to toggle source
# File lib/depdump/tracer.rb, line 43 def trace_const(node, namespaces) referenced_namespaces = expand_const_namespaces(node, []) if referenced_namespaces.first.nil? # Top level nil is inserted when :cbase appeared @context.create_relation(referenced_namespaces[1..-1], search_entry_node: @registry_tree.root) else @context.create_relation(referenced_namespaces) end end