class Yoda::Server::Providers::Completion
Public Class Methods
provider_method()
click to toggle source
# File lib/yoda/server/providers/completion.rb, line 5 def self.provider_method :'textDocument/completion' end
Public Instance Methods
provide(params)
click to toggle source
# File lib/yoda/server/providers/completion.rb, line 9 def provide(params) uri = params[:text_document][:uri] position = params[:position] calculate(uri, position) end
timeout()
click to toggle source
# File lib/yoda/server/providers/completion.rb, line 16 def timeout 10 end
Private Instance Methods
calculate(uri, position)
click to toggle source
@param uri [String] @param position [{Symbol => Integer}]
# File lib/yoda/server/providers/completion.rb, line 24 def calculate(uri, position) source = session.file_store.get(uri) location = Parsing::Location.of_language_server_protocol_position(line: position[:line], character: position[:character]) if candidates = comment_complete(source, location) return candidates end complete_from_cut_source(source, location) end
comment_complete(source, location)
click to toggle source
@param source [String] @param location [Parsing::Location] @return [LanguageServerProtocol::Interface::CompletionList, nil]
# File lib/yoda/server/providers/completion.rb, line 37 def comment_complete(source, location) ast, comments = Parsing::Parser.new.parse_with_comments(source) return nil unless Parsing::Query::CurrentCommentQuery.new(comments, location).current_comment completion_worker = Evaluation::CommentCompletion.new(session.registry, ast, comments, location) return nil unless completion_worker.available? completion_items = completion_worker.candidates LanguageServer::Protocol::Interface::CompletionList.new( is_incomplete: false, items: completion_worker.candidates.map { |completion_item| create_completion_item(completion_item) }, ) rescue ::Parser::SyntaxError nil end
complete_from_cut_source(source, location)
click to toggle source
@param source [String] @param location [Parsing::Location] @return [LanguageServerProtocol::Interface::CompletionList, nil]
# File lib/yoda/server/providers/completion.rb, line 56 def complete_from_cut_source(source, location) cut_source = Parsing::SourceCutter.new(source, location).error_recovered_source method_completion_worker = Evaluation::CodeCompletion.new(session.registry, cut_source, location) completion_items = method_completion_worker.candidates LanguageServer::Protocol::Interface::CompletionList.new( is_incomplete: false, items: completion_items.map { |completion_item| create_completion_item(completion_item) }, ) end
create_completion_item(completion_item)
click to toggle source
@param completion_item [Model::CompletionItem] @return [LanguageServer::Protocol::Interface::CompletionItem]
# File lib/yoda/server/providers/completion.rb, line 69 def create_completion_item(completion_item) LanguageServer::Protocol::Interface::CompletionItem.new( label: completion_item.description.is_a?(Model::Descriptions::FunctionDescription) ? completion_item.description.signature : completion_item.description.sort_text, kind: completion_item.language_server_kind, detail: completion_item.description.title, documentation: completion_item.description.to_markdown, sort_text: completion_item.description.sort_text, text_edit: LanguageServer::Protocol::Interface::TextEdit.new( range: LanguageServer::Protocol::Interface::Range.new(completion_item.range.to_language_server_protocol_range), new_text: completion_item.edit_text, ), data: {}, ) end