# typed: strict# frozen_string_literal: truemoduleRubyLspmoduleListenersclassHoverextendT::SigincludeRequests::Support::CommonALLOWED_TARGETS=T.let([Prism::CallNode,Prism::ConstantReadNode,Prism::ConstantWriteNode,Prism::ConstantPathNode,],T::Array[T.class_of(Prism::Node)],)ALLOWED_REMOTE_PROVIDERS=T.let(["https://github.com","https://gitlab.com",].freeze,T::Array[String],)sigdoparams(response_builder: ResponseBuilders::Hover,uri: URI::Generic,nesting: T::Array[String],index: RubyIndexer::Index,dispatcher: Prism::Dispatcher,typechecker_enabled: T::Boolean,).voidenddefinitialize(response_builder,uri,nesting,index,dispatcher,typechecker_enabled)# rubocop:disable Metrics/ParameterLists@response_builder=response_builder@path=T.let(uri.to_standardized_path,T.nilable(String))@nesting=nesting@index=index@typechecker_enabled=typechecker_enableddispatcher.register(self,:on_constant_read_node_enter,:on_constant_write_node_enter,:on_constant_path_node_enter,:on_call_node_enter,)endsig{params(node: Prism::ConstantReadNode).void}defon_constant_read_node_enter(node)returnif@typechecker_enabledgenerate_hover(node.slice,node.location)endsig{params(node: Prism::ConstantWriteNode).void}defon_constant_write_node_enter(node)returnifDependencyDetector.instance.typecheckergenerate_hover(node.name.to_s,node.name_loc)endsig{params(node: Prism::ConstantPathNode).void}defon_constant_path_node_enter(node)returnifDependencyDetector.instance.typecheckergenerate_hover(node.slice,node.location)endsig{params(node: Prism::CallNode).void}defon_call_node_enter(node)returnunlessself_receiver?(node)if@path&&File.basename(@path)==GEMFILE_NAME&&node.name==:gemgenerate_gem_hover(node)returnendreturnif@typechecker_enabledmessage=node.messagereturnunlessmessagetarget_method=@index.resolve_method(message,@nesting.join("::"))returnunlesstarget_methodcategorized_markdown_from_index_entries(message,target_method).eachdo|category,content|@response_builder.push(content,category: category)endendprivatesig{params(name: String,location: Prism::Location).void}defgenerate_hover(name,location)entries=@index.resolve(name,@nesting)returnunlessentries# We should only show hover for private constants if the constant is defined in the same namespace as the# referencefirst_entry=T.must(entries.first)returniffirst_entry.visibility==:private&&first_entry.name!="#{@nesting.join("::")}::#{name}"categorized_markdown_from_index_entries(name,entries).eachdo|category,content|@response_builder.push(content,category: category)endendsig{params(node: Prism::CallNode).void}defgenerate_gem_hover(node)first_argument=node.arguments&.arguments&.firstreturnunlessfirst_argument.is_a?(Prism::StringNode)spec=Gem::Specification.find_by_name(first_argument.content)returnunlessspecinfo=T.let([spec.description,spec.summary,"This rubygem does not have a description or summary.",].find{|text|!text.nil?&&!text.empty?},String,)# Remove leading whitespace if a heredoc was used for the summary or descriptioninfo=info.gsub(/^ +/,"")remote_url=[spec.homepage,spec.metadata["source_code_uri"]].compact.finddo|page|page.start_with?(*ALLOWED_REMOTE_PROVIDERS)end@response_builder.push("**#{spec.name}** (#{spec.version}) #{remote_url&&" - [open remote](#{remote_url})"}",category: :title,)@response_builder.push(info,category: :documentation)rescueGem::MissingSpecError# Do nothing if the spec cannot be foundendendendend