class Orbacle::LangServer

Attributes

engine[R]
logger[R]

Public Class Methods

new(logger, engine) click to toggle source
# File lib/orbacle/lang_server.rb, line 14
def initialize(logger, engine)
  @logger = logger
  @engine = engine
  @file_contents = {}
end

Public Instance Methods

get_file_content(uri) click to toggle source
# File lib/orbacle/lang_server.rb, line 75
def get_file_content(uri)
  @file_contents[uri.path] || File.read(uri.path)
end
handle_initialize(request) click to toggle source
# File lib/orbacle/lang_server.rb, line 22
def handle_initialize(request)
  root_path = request.root_uri.path
  logger.info("Initializing at #{root_path.inspect}")
  engine.index(root_path)
  Lsp::ResponseMessage.successful(nil)
end
handle_text_document_completion(request) click to toggle source
# File lib/orbacle/lang_server.rb, line 52
def handle_text_document_completion(request)
  log_errors do
    file_content = get_file_content(request.text_document.uri)
    completions = engine.completions_for_call_under_position(file_content, Position.new(request.position.line, request.position.character - 1))
    Lsp::ResponseMessage.successful(completions.map {|c| Lsp::CompletionItem.new(c) })
  end
end
handle_text_document_definition(request) click to toggle source
# File lib/orbacle/lang_server.rb, line 39
def handle_text_document_definition(request)
  log_errors do
    file_path = request.text_document.uri.path
    file_content = File.read(file_path)
    locations = engine.locations_for_definition_under_position(file_path, file_content, Position.new(request.position.line, request.position.character))
    if locations
      Lsp::ResponseMessage.successful(locations.map(&method(:location_to_lsp_location)))
    else
      Lsp::ResponseMessage.new(nil, Errors::NoDefinitionFound)
    end
  end
end
handle_text_document_did_change(request) click to toggle source
# File lib/orbacle/lang_server.rb, line 60
def handle_text_document_did_change(request)
  log_errors do
    @file_contents[request.text_document.uri.path] = request.content_changes[0].text
  end
end
handle_text_document_hover(request) click to toggle source
# File lib/orbacle/lang_server.rb, line 29
def handle_text_document_hover(request)
  log_errors do
    filepath = request.text_document.uri.path
    pretty_type = engine.get_type_information(filepath, Position.new(request.position.line, request.position.character))
    Lsp::ResponseMessage.successful(
      Lsp::TextDocumentHoverResult.new(
        "Type of that expression: #{pretty_type}"))
  end
end
location_to_lsp_location(location) click to toggle source
# File lib/orbacle/lang_server.rb, line 79
def location_to_lsp_location(location)
  Lsp::Location.new(
    URI("file://#{location.uri}"),
    Lsp::Range.new(
      Lsp::Position.new(location.start.line, location.start.character),
      Lsp::Position.new(location.end.line, location.end.character)))
end
log_errors() { || ... } click to toggle source
# File lib/orbacle/lang_server.rb, line 66
def log_errors
  begin
    yield
  rescue => e
    logger.error(e)
    raise
  end
end