class RBS::ConstantTable

def resolve_constant_reference(name, context:)

def resolve_constant_reference(name, context:)
  raise "Context cannot be empty: Specify `[Namespace.root]`" if context.empty?
  head, *tail = split_name(name)
  raise unless head
  head_constant = case
                  when name.absolute?
                    name_to_constant(TypeName.new(name: head, namespace: Namespace.root))
                  when context == [Namespace.root]
                    name_to_constant(TypeName.new(name: head, namespace: Namespace.root))
                  else
                    resolve_constant_reference_context(head, context: context) ||
                      context.first.yield_self do |first_contet|
                        raise unless first_contet
                        resolve_constant_reference_inherit(head, scopes: constant_scopes(first_contet.to_type_name))
                      end
                  end
  tail.inject(head_constant) do |constant, name|
    if constant
      resolve_constant_reference_inherit(
        name,
        scopes: constant_scopes(constant.name),
        no_object: constant.name != BuiltinNames::Object.name
      )
    end
  end
end