class RubyLsp::Requests::Hover

def initialize(document, global_state, position, dispatcher, sorbet_level)

: ((RubyDocument | ERBDocument) document, GlobalState global_state, Hash[Symbol, untyped] position, Prism::Dispatcher dispatcher, SorbetLevel sorbet_level) -> void
def initialize(document, global_state, position, dispatcher, sorbet_level)
  super()
  char_position, _ = document.find_index_by_position(position)
  delegate_request_if_needed!(global_state, document, char_position)
  node_context = RubyDocument.locate(
    document.ast,
    char_position,
    node_types: Listeners::Hover::ALLOWED_TARGETS,
    code_units_cache: document.code_units_cache,
  )
  target = node_context.node
  parent = node_context.parent
  if should_refine_target?(parent, target)
    target = determine_target(
      target, #: as !nil
      parent, #: as !nil
      position,
    )
  elsif position_outside_target?(position, target)
    target = nil
  end
  # Don't need to instantiate any listeners if there's no target
  return unless target
  @target = target #: Prism::Node?
  uri = document.uri
  @response_builder = ResponseBuilders::Hover.new #: ResponseBuilders::Hover
  Listeners::Hover.new(@response_builder, global_state, uri, node_context, dispatcher, sorbet_level)
  Addon.addons.each do |addon|
    addon.create_hover_listener(@response_builder, node_context, dispatcher)
  end
  @dispatcher = dispatcher
end