lib/solargraph/language_server/message/text_document/completion.rb
require 'time' module Solargraph module LanguageServer module Message module TextDocument class Completion < Base def process start = Time.now processed = false until processed if host.changing?(params['textDocument']['uri']) if Time.now - start > 1 # set_error Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, 'Completion request timed out' set_result empty_result processed = true end else inner_process processed = true end sleep 0.1 unless processed end end private def inner_process filename = uri_to_file(params['textDocument']['uri']) line = params['position']['line'] col = params['position']['character'] begin completion = host.completions_at(filename, line, col) if host.cancel?(id) return set_result(empty_result) if host.cancel?(id) end items = [] idx = 0 completion.pins.each do |pin| items.push pin.completion_item.merge({ textEdit: { range: completion.range.to_hash, newText: pin.name }, sortText: "#{pin.name}#{idx.to_s.rjust(4, '0')}" }) idx += 1 end set_result( isIncomplete: false, items: items ) rescue InvalidOffsetError => e STDERR.puts "Skipping invalid offset: #{filename}, line #{line}, character #{col}" set_result empty_result end end def empty_result { isIncomplete: false, items: [] } end end end end end end