Class: RBS::AncestorGraph
- Inherits:
-
Object
- Object
- RBS::AncestorGraph
- Defined in:
- lib/rbs/ancestor_graph.rb
Constant Summary collapse
- InstanceNode =
_ = Struct.new(:type_name, keyword_init: true)
- SingletonNode =
_ = Struct.new(:type_name, keyword_init: true)
Instance Attribute Summary collapse
-
#ancestor_builder ⇒ Object
readonly
Returns the value of attribute ancestor_builder.
-
#children ⇒ Object
readonly
Returns the value of attribute children.
-
#env ⇒ Object
readonly
Returns the value of attribute env.
-
#parents ⇒ Object
readonly
Returns the value of attribute parents.
Instance Method Summary collapse
- #build ⇒ Object
- #build_ancestors(node, ancestors) ⇒ Object
- #each_ancestor(node, yielded: , &block) ⇒ Object
- #each_child(node, &block) ⇒ Object
- #each_descendant(node, yielded: , &block) ⇒ Object
- #each_parent(node, &block) ⇒ Object
-
#initialize(env:, ancestor_builder: DefinitionBuilder::AncestorBuilder.new(env: env)) ⇒ AncestorGraph
constructor
A new instance of AncestorGraph.
- #register(parent:, child:) ⇒ Object
Constructor Details
#initialize(env:, ancestor_builder: DefinitionBuilder::AncestorBuilder.new(env: env)) ⇒ AncestorGraph
Returns a new instance of AncestorGraph.
13 14 15 16 17 |
# File 'lib/rbs/ancestor_graph.rb', line 13 def initialize(env:, ancestor_builder: DefinitionBuilder::AncestorBuilder.new(env: env)) @env = env @ancestor_builder = ancestor_builder build() end |
Instance Attribute Details
#ancestor_builder ⇒ Object (readonly)
Returns the value of attribute ancestor_builder.
9 10 11 |
# File 'lib/rbs/ancestor_graph.rb', line 9 def ancestor_builder @ancestor_builder end |
#children ⇒ Object (readonly)
Returns the value of attribute children.
11 12 13 |
# File 'lib/rbs/ancestor_graph.rb', line 11 def children @children end |
#env ⇒ Object (readonly)
Returns the value of attribute env.
8 9 10 |
# File 'lib/rbs/ancestor_graph.rb', line 8 def env @env end |
#parents ⇒ Object (readonly)
Returns the value of attribute parents.
10 11 12 |
# File 'lib/rbs/ancestor_graph.rb', line 10 def parents @parents end |
Instance Method Details
#build ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/rbs/ancestor_graph.rb', line 19 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) ⇒ Object
32 33 34 35 36 37 38 39 40 41 |
# File 'lib/rbs/ancestor_graph.rb', line 32 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) ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/rbs/ancestor_graph.rb', line 64 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) ⇒ Object
56 57 58 59 60 61 62 |
# File 'lib/rbs/ancestor_graph.rb', line 56 def each_child(node, &block) if block children[node]&.each(&block) else enum_for :each_child, node end end |
#each_descendant(node, yielded: , &block) ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/rbs/ancestor_graph.rb', line 78 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) ⇒ Object
48 49 50 51 52 53 54 |
# File 'lib/rbs/ancestor_graph.rb', line 48 def each_parent(node, &block) if block parents[node]&.each(&block) else enum_for :each_parent, node end end |
#register(parent:, child:) ⇒ Object
43 44 45 46 |
# File 'lib/rbs/ancestor_graph.rb', line 43 def register(parent:, child:) (parents[child] ||= Set[]) << parent (children[parent] ||= Set[]) << child end |