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