Sha256: 8d5a539c65208e27485b99570450f3a0ee0f47a4710736b8d259a1449bcd749a

Contents?: true

Size: 1.87 KB

Versions: 3

Compression:

Stored size: 1.87 KB

Contents

module Yoda
  class Server
    module Providers
      class Signature < Base
        def self.provider_method
          :'textDocument/signatureHelp'
        end

        # @param params [Hash]
        def provide(params)
          calculate(params[:text_document][:uri], params[:position])
        end

        def timeout
          10
        end

        private

        # @params uri [String]
        # @params position [{Symbol => Integer}]
        def calculate(uri, position)
          source = session.file_store.get(uri)
          location = Parsing::Location.of_language_server_protocol_position(line: position[:line], character: position[:character])
          cut_source = Parsing::SourceCutter.new(source, location).error_recovered_source

          signature_worker = Evaluation::SignatureDiscovery.new(session.registry, cut_source, location)

          functions = signature_worker.method_candidates
          create_signature_help(functions)
        end

        # @param code_objects [Array<Model::FunctionSignatures::Base>]
        def create_signature_help(functions)
          signatures = functions.map { |func| Model::Descriptions::FunctionDescription.new(func) }
          LanguageServer::Protocol::Interface::SignatureHelp.new(
            signatures: signatures.map { |signature| create_signature_info(signature) },
          )
        end

        # @param signature [Evaluation::Descriptions::FunctionDescription]
        def create_signature_info(signature)
          LanguageServer::Protocol::Interface::SignatureInformation.new(
            label: signature.title.to_s,
            documentation: signature.to_markdown,
            parameters: signature.parameter_names.map do |parameter|
              LanguageServer::Protocol::Interface::ParameterInformation.new(
                label: parameter,
              )
            end,
          )
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
yoda-language-server-0.7.2 lib/yoda/server/providers/signature.rb
yoda-language-server-0.7.1 lib/yoda/server/providers/signature.rb
yoda-language-server-0.7.0 lib/yoda/server/providers/signature.rb