Object
# File rbs-1.4.0/lib/rbs/ancestor_graph.rb, line 11
def initialize(env:, ancestor_builder: DefinitionBuilder::AncestorBuilder.new(env: env))
@env = env
@ancestor_builder = ancestor_builder
build()
end
# File rbs-1.4.0/lib/rbs/ancestor_graph.rb, line 17
def build()
@parents = {}
@children = {}
env.class_decls.each_key do |type_name|
build_ancestors(InstanceNode.new(type_name: type_name), ancestor_builder.one_instance_ancestors(type_name))
build_ancestors(SingletonNode.new(type_name: type_name), ancestor_builder.one_singleton_ancestors(type_name))
end
env.interface_decls.each_key do |type_name|
build_ancestors(InstanceNode.new(type_name: type_name), ancestor_builder.one_interface_ancestors(type_name))
end
end
# File rbs-1.4.0/lib/rbs/ancestor_graph.rb, line 30
def build_ancestors(node, ancestors)
ancestors.each_ancestor do |ancestor|
case ancestor
when Definition::Ancestor::Instance
register(child: node, parent: InstanceNode.new(type_name: ancestor.name))
when Definition::Ancestor::Singleton
register(child: node, parent: SingletonNode.new(type_name: ancestor.name))
end
end
end
# File rbs-1.4.0/lib/rbs/ancestor_graph.rb, line 62
def each_ancestor(node, yielded: Set[], &block)
if block
each_parent(node) do |parent|
unless yielded.member?(parent)
yielded << parent
yield parent
each_ancestor(parent, yielded: yielded, &block)
end
end
else
enum_for :each_ancestor, node
end
end
# File rbs-1.4.0/lib/rbs/ancestor_graph.rb, line 54
def each_child(node, &block)
if block
children[node]&.each(&block)
else
enum_for :each_child, node
end
end
# File rbs-1.4.0/lib/rbs/ancestor_graph.rb, line 76
def each_descendant(node, yielded: Set[], &block)
if block
each_child(node) do |child|
unless yielded.member?(child)
yielded << child
yield child
each_descendant(child, yielded: yielded, &block)
end
end
else
enum_for :each_descendant, node
end
end