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