# typed: strict# frozen_string_literal: truerequire"ruby_lsp/listeners/hover"moduleRubyLspmoduleRequests# The [hover request](https://microsoft.github.io/language-server-protocol/specification#textDocument_hover)# displays the documentation for the symbol currently under the cursor.#: [ResponseType = Interface::Hover?]classHover<Requestclass<<self#: -> Interface::HoverOptionsdefproviderInterface::HoverOptions.newendend#: ((RubyDocument | ERBDocument) document, GlobalState global_state, Hash[Symbol, untyped] position, Prism::Dispatcher dispatcher, SorbetLevel sorbet_level) -> voiddefinitialize(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.nodeparent=node_context.parentifshould_refine_target?(parent,target)target=determine_target(target,#: as !nilparent,#: as !nilposition,)elsifposition_outside_target?(position,target)target=nilend# Don't need to instantiate any listeners if there's no targetreturnunlesstarget@target=target#: Prism::Node?uri=document.uri@response_builder=ResponseBuilders::Hover.new#: ResponseBuilders::HoverListeners::Hover.new(@response_builder,global_state,uri,node_context,dispatcher,sorbet_level)Addon.addons.eachdo|addon|addon.create_hover_listener(@response_builder,node_context,dispatcher)end@dispatcher=dispatcherend# @override#: -> ResponseTypedefperformreturnunless@target@dispatcher.dispatch_once(@target)returnif@response_builder.empty?Interface::Hover.new(contents: Interface::MarkupContent.new(kind: "markdown",value: @response_builder.response,),)endprivate#: (Prism::Node? parent, Prism::Node? target) -> booldefshould_refine_target?(parent,target)(Listeners::Hover::ALLOWED_TARGETS.include?(parent.class)&&!Listeners::Hover::ALLOWED_TARGETS.include?(target.class))||(parent.is_a?(Prism::ConstantPathNode)&&target.is_a?(Prism::ConstantReadNode))end#: (Hash[Symbol, untyped] position, Prism::Node? target) -> booldefposition_outside_target?(position,target)casetargetwhenPrism::GlobalVariableAndWriteNode,Prism::GlobalVariableOperatorWriteNode,Prism::GlobalVariableOrWriteNode,Prism::GlobalVariableWriteNode!covers_position?(target.name_loc,position)whenPrism::CallNode!covers_position?(target.message_loc,position)elsefalseendendendendend