Class: RBS::AncestorGraph
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/rbs/ancestor_graph.rb |
Constant Summary
-
InstanceNode =
# File 'lib/rbs/ancestor_graph.rb', line 3_ = Struct.new(:type_name, keyword_init: true)
-
SingletonNode =
# File 'lib/rbs/ancestor_graph.rb', line 4_ = Struct.new(:type_name, keyword_init: true)
Class Method Summary
Instance Attribute Summary
- #ancestor_builder readonly
- #children readonly
- #env readonly
- #parents readonly
Instance Method Summary
Constructor Details
.new(env:, ancestor_builder: DefinitionBuilder::AncestorBuilder.new(env: env)) ⇒ AncestorGraph
# File '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
Instance Attribute Details
#ancestor_builder (readonly)
[ GitHub ]# File 'lib/rbs/ancestor_graph.rb', line 7
attr_reader :ancestor_builder
#children (readonly)
[ GitHub ]# File 'lib/rbs/ancestor_graph.rb', line 9
attr_reader :children
#env (readonly)
[ GitHub ]# File 'lib/rbs/ancestor_graph.rb', line 6
attr_reader :env
#parents (readonly)
[ GitHub ]# File 'lib/rbs/ancestor_graph.rb', line 8
attr_reader :parents
Instance Method Details
#build
[ GitHub ]# File '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
#build_ancestors(node, ancestors)
[ GitHub ]# File '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
#each_ancestor(node, yielded: , &block)
[ GitHub ]# File '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
#each_child(node, &block)
[ GitHub ]# File '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
#each_descendant(node, yielded: , &block)
[ GitHub ]# File '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
#each_parent(node, &block)
[ GitHub ]# File 'lib/rbs/ancestor_graph.rb', line 46
def each_parent(node, &block) if block parents[node]&.each(&block) else enum_for :each_parent, node end end