class Steep::Services::HoverProvider::RBS

def content_for(target:, path:, line:, column:)

def content_for(target:, path:, line:, column:)
  service = self.service.signature_services.fetch(target.name)
  env = service.latest_env
  source = env.each_rbs_source.find {|src| src.buffer.name == path } or return
  buffer = source.buffer
  dirs = source.directives
  decls = source.declarations
  locator = ::RBS::Locator.new(buffer: buffer, dirs: dirs, decls: decls)
  loc_key, path = locator.find2(line: line, column: column) || return
  head, *_tail = path
  case head
  when ::RBS::Types::Alias
    content_for_type_name(head.name, env: env, location: head.location || raise)
  when ::RBS::Types::ClassInstance, ::RBS::Types::ClassSingleton
    if loc_key == :name
      location = head.location&.[](:name) or raise
      content_for_type_name(head.name, env: env, location: location)
    end
  when ::RBS::Types::Interface
    location = head.location&.[](:name) or raise
    content_for_type_name(head.name, env: env, location: location)
  when ::RBS::AST::Declarations::ClassAlias, ::RBS::AST::Declarations::ModuleAlias
    if loc_key == :old_name
      location = head.location&.[](:old_name) or raise
      content_for_type_name(head.old_name, env: env, location: location)
    end
  when ::RBS::AST::Directives::Use::SingleClause
    if loc_key == :type_name
      location = head.location&.[](:type_name) or raise
      content_for_type_name(head.type_name.absolute!, env: env, location: location)
    end
  when ::RBS::AST::Directives::Use::WildcardClause
    if loc_key == :namespace
      location = head.location&.[](:namespace) or raise
      content_for_type_name(head.namespace.to_type_name.absolute!, env: env, location: location)
    end
  end
end

def content_for_type_name(type_name, env:, location:)

def content_for_type_name(type_name, env:, location:)
  case
  when type_name.alias?
    alias_decl = env.type_alias_decls[type_name]&.decl or return
    TypeAliasContent.new(location: location, decl: alias_decl)
  when type_name.interface?
    interface_decl = env.interface_decls[type_name]&.decl or return
    InterfaceTypeContent.new(location: location, decl: interface_decl)
  when type_name.class?
    class_entry = env.module_class_entry(type_name) or return
    case class_entry
    when ::RBS::Environment::ClassEntry, ::RBS::Environment::ModuleEntry
      class_decl = class_entry.primary_decl
    when ::RBS::Environment::ClassAliasEntry, ::RBS::Environment::ModuleAliasEntry
      class_decl = class_entry.decl
    end
    ClassTypeContent.new(location: location, decl: class_decl)
  end
end

def initialize(service:)

def initialize(service:)
  @service = service
end

def project

def project
  service.project
end