class RBS::EnvironmentWalker

def tsort_each_child(node, &block)

def tsort_each_child(node, &block)
  name = node.type_name
  unless name.namespace.empty?
    yield SingletonNode.new(type_name: name.namespace.to_type_name)
  end
  case node
  when TypeNameNode
    case
    when name.interface?
      definition = builder.build_interface(name)
      unless only_ancestors?
        definition.each_type do |type|
          each_type_node type, &block
        end
      end
    when name.alias?
      each_type_node builder.expand_alias1(name), &block
    else
      raise "Unexpected TypeNameNode with type_name=#{name}"
    end
  when InstanceNode, SingletonNode
    definition = if node.is_a?(InstanceNode)
                   builder.build_instance(name)
                 else
                   builder.build_singleton(name)
                 end
    if ancestors = definition.ancestors
      ancestors.ancestors.each do |ancestor|
        case ancestor
        when Definition::Ancestor::Instance
          yield InstanceNode.new(type_name: ancestor.name)
          unless only_ancestors?
            ancestor.args.each do |type|
              each_type_node type, &block
            end
          end
        when Definition::Ancestor::Singleton
          yield SingletonNode.new(type_name: ancestor.name)
        end
      end
    end
    unless only_ancestors?
      definition.each_type do |type|
        each_type_node type, &block
      end
    end
  end
end