# typed: strict# frozen_string_literal: truerequire"ruby_lsp/listeners/signature_help"moduleRubyLspmoduleRequests# The [signature help# request](https://microsoft.github.io/language-server-protocol/specification#textDocument_signatureHelp) displays# information about the parameters of a method as you type an invocation.classSignatureHelp<Requestclass<<self#: -> Interface::SignatureHelpOptionsdefprovider# Identifier characters are automatically included, such as A-Z, a-z, 0-9, _, * or :Interface::SignatureHelpOptions.new(trigger_characters: ["("," ",","],)endend#: ((RubyDocument | ERBDocument) document, GlobalState global_state, Hash[Symbol, untyped] position, Hash[Symbol, untyped]? context, Prism::Dispatcher dispatcher, SorbetLevel sorbet_level) -> voiddefinitialize(document,global_state,position,context,dispatcher,sorbet_level)# rubocop:disable Metrics/ParameterListssuper()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: [Prism::CallNode],code_units_cache: document.code_units_cache,)target=adjust_for_nested_target(node_context.node,node_context.parent,position)@target=target#: Prism::Node?@dispatcher=dispatcher@response_builder=ResponseBuilders::SignatureHelp.new#: ResponseBuilders::SignatureHelpListeners::SignatureHelp.new(@response_builder,global_state,node_context,dispatcher,sorbet_level)end# @override#: -> Interface::SignatureHelp?defperformreturnunless@target@dispatcher.dispatch_once(@target)@response_builder.responseendprivate# Adjust the target of signature help in the case where we have nested method calls. This is necessary so that we# select the right target in a situation like this:## foo(another_method_call)## In that case, we want to provide signature help for `foo` and not `another_method_call`.#: (Prism::Node? target, Prism::Node? parent, Hash[Symbol, untyped] position) -> Prism::Node?defadjust_for_nested_target(target,parent,position)# If the parent node is not a method call, then make no adjustmentsreturntargetunlessparent.is_a?(Prism::CallNode)# If the parent is a method call, but the target isn't, then return the parentreturnparentunlesstarget.is_a?(Prism::CallNode)# If both are method calls, we check the arguments of the inner method call. If there are no arguments, then# we're providing signature help for the outer method call.## If there are arguments, then we check if the arguments node covers the requested position. If it doesn't# cover, then we're providing signature help for the outer method call.arguments=target.argumentsarguments.nil?||!node_covers?(arguments,position)?parent:targetend#: (Prism::Node node, Hash[Symbol, untyped] position) -> booldefnode_covers?(node,position)location=node.locationstart_line=location.start_line-1start_character=location.start_columnend_line=location.end_line-1end_character=location.end_columnstart_covered=start_line<position[:line]||(start_line==position[:line]&&start_character<=position[:character])end_covered=end_line>position[:line]||(end_line==position[:line]&&end_character>=position[:character])start_covered&&end_coveredendendendend