Sha256: 9356a6ceab9fb56e3c70ce4667ce77273e79f3fade1a1dab982267d6a8e54963

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

module Yoda
  class Server
    class SignatureProvider
      attr_reader :client_info

      # @param client_info [ClientInfo]
      def initialize(client_info)
        @client_info = client_info
      end

      # @param uri      [String]
      # @param position [{Symbol => Integer}]
      def provide(uri, position)
        source = client_info.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(client_info.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) }
        LSP::Interface::SignatureHelp.new(
          signatures: signatures.map { |signature| create_signature_info(signature) },
        )
      end

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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
yoda-language-server-0.4.0 lib/yoda/server/signature_provider.rb