module LanguageServer

Constants

VERSION

Attributes

options[RW]

Public Class Methods

adhoc_enabled?() click to toggle source
# File lib/language_server.rb, line 66
def adhoc_enabled?
  options[:experimental_features_enabled]
end
logger() click to toggle source
# File lib/language_server/logger.rb, line 5
def logger
  @logger ||= ::Logger.new(STDERR, formatter: Formatter.new)
end
on(method, &callback) click to toggle source
# File lib/language_server.rb, line 74
def on(method, &callback)
  subscribers[method] = callback
end
rubocop_enabled?() click to toggle source
# File lib/language_server.rb, line 62
def rubocop_enabled?
  options[:experimental_features_enabled]
end
run(options) click to toggle source
# File lib/language_server.rb, line 17
def run(options)
  self.options = options

  writer = Protocol::Transport::Stdio::Writer.new
  reader = Protocol::Transport::Stdio::Reader.new
  variables = {}

  class << writer
    def respond(id:, result:)
      write(id: id, result: result)

      LanguageServer.logger.debug("Respond: id: #{id}, result: #{JSON.pretty_generate(result)}")
    end

    def notify(method:, params: {})
      write(method: method, params: params)

      LanguageServer.logger.debug("Notify: method: #{method}, params: #{JSON.pretty_generate(params)}")
    end
  end

  reader.read do |request|
    logger.debug("Receive: #{JSON.pretty_generate(request)}")

    method = request[:method].to_sym

    subscriber = subscribers[method]

    if subscriber
      keys = subscriber.parameters.map(&:last)
      result = subscriber.call(
        {
          request: request, notifier: writer.method(:notify), variables: variables
        }.merge(variables).select { |k, _| keys.include?(k) },
      )

      if request[:id]
        writer.respond(id: request[:id], result: result)
      end
    else
      logger.debug("Ignore: #{method}")
    end
  end
end
subscribers() click to toggle source
# File lib/language_server.rb, line 70
def subscribers
  @subscribers ||= {}
end