class RBS::AncestorGraph - rbs: Ruby Standard Library Documentation

# class RBS::AncestorGraph

### Constants

InstanceNode
SingletonNode

### Attributes

ancestor_builder[R]
children[R]
env[R]
parents[R]

### Public Class Methods

new(env:, ancestor_builder: DefinitionBuilder::AncestorBuilder.new(env: env)) click to toggle source

    # File rbs-3.8.0/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

### Public Instance Methods

build() click to toggle source

    # File rbs-3.8.0/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) click to toggle source

    # File rbs-3.8.0/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: Set[]) { |parent| ... } click to toggle source

    # File rbs-3.8.0/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) click to toggle source

    # File rbs-3.8.0/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: Set[]) { |child| ... } click to toggle source

    # File rbs-3.8.0/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) click to toggle source

    # File rbs-3.8.0/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:) click to toggle source

    # File rbs-3.8.0/lib/rbs/ancestor_graph.rb, line 43
    def register(parent:, child:)
      (parents[child] ||= Set[]) << parent
      (children[parent] ||= Set[]) << child
    end