class Spoom::Cli::LSP

Public Instance Methods

defs(file, line, col) click to toggle source

TODO: options, filter, limit, kind etc.. filter rbi

# File lib/spoom/cli/lsp.rb, line 53
def defs(file, line, col)
  run do |client|
    res = client.definitions(to_uri(file), line.to_i, col.to_i)
    say("Definitions for `#{file}:#{line}:#{col}`:")
    symbol_printer.print_list(res)
  end
end
find(query) click to toggle source

TODO: options, filter, limit, kind etc.. filter rbi

# File lib/spoom/cli/lsp.rb, line 63
def find(query)
  run do |client|
    res = client.symbols(query).reject { |symbol| symbol.location.uri.start_with?("https") }
    say("Symbols matching `#{query}`:")
    symbol_printer.print_objects(res)
  end
end
hover(file, line, col) click to toggle source

TODO: options, filter, limit, kind etc.. filter rbi

# File lib/spoom/cli/lsp.rb, line 39
def hover(file, line, col)
  run do |client|
    res = client.hover(to_uri(file), line.to_i, col.to_i)
    say("Hovering `#{file}:#{line}:#{col}`:")
    if res
      symbol_printer.print_object(res)
    else
      say("<no data>")
    end
  end
end
list() click to toggle source

TODO: options, filter, limit, kind etc.. filter rbi

# File lib/spoom/cli/lsp.rb, line 25
def list
  run do |client|
    printer = symbol_printer
    Dir["**/*.rb"].each do |file|
      res = client.document_symbols(to_uri(file))
      next if res.empty?
      say("Symbols from `#{file}`:")
      printer.print_objects(res)
    end
  end
end
lsp_client() click to toggle source
# File lib/spoom/cli/lsp.rb, line 112
def lsp_client
  in_sorbet_project!
  path = exec_path
  client = Spoom::LSP::Client.new(
    Spoom::Sorbet::BIN_PATH,
    "--lsp",
    "--enable-all-experimental-lsp-features",
    "--disable-watchman",
    path: path
  )
  client.open(File.expand_path(path))
  client
end
refs(file, line, col) click to toggle source

TODO: options, filter, limit, kind etc.. filter rbi

# File lib/spoom/cli/lsp.rb, line 83
def refs(file, line, col)
  run do |client|
    res = client.references(to_uri(file), line.to_i, col.to_i)
    say("References to `#{file}:#{line}:#{col}`:")
    symbol_printer.print_list(res)
  end
end
run(&block) click to toggle source
# File lib/spoom/cli/lsp.rb, line 134
def run(&block)
  client = lsp_client
  block.call(client)
rescue Spoom::LSP::Error::Diagnostics => err
  say_error("Sorbet returned typechecking errors for `#{symbol_printer.clean_uri(err.uri)}`")
  err.diagnostics.each do |d|
    say_error("#{d.message} (#{d.code})", status: "  #{d.range}")
  end
  exit(1)
rescue Spoom::LSP::Error::BadHeaders => err
  say_error("Sorbet didn't answer correctly (#{err.message})")
  exit(1)
rescue Spoom::LSP::Error => err
  say_error(err.message)
  exit(1)
ensure
  begin
    client&.close
  rescue
    # We can't do much if Sorbet refuse to close.
    # We kill the parent process and let the child be killed.
    exit(1)
  end
end
show() click to toggle source
# File lib/spoom/cli/lsp.rb, line 16
def show
  in_sorbet_project!
  lsp = lsp_client
  # TODO: run interactive mode
  puts lsp
end
sigs(file, line, col) click to toggle source

TODO: options, filter, limit, kind etc.. filter rbi

# File lib/spoom/cli/lsp.rb, line 93
def sigs(file, line, col)
  run do |client|
    res = client.signatures(to_uri(file), line.to_i, col.to_i)
    say("Signature for `#{file}:#{line}:#{col}`:")
    symbol_printer.print_list(res)
  end
end
symbol_printer() click to toggle source
# File lib/spoom/cli/lsp.rb, line 126
def symbol_printer
  Spoom::LSP::SymbolPrinter.new(
    indent_level: 2,
    colors: options[:color],
    prefix: "file://#{File.expand_path(exec_path)}"
  )
end
symbols(file) click to toggle source

TODO: options, filter, limit, kind etc.. filter rbi

# File lib/spoom/cli/lsp.rb, line 73
def symbols(file)
  run do |client|
    res = client.document_symbols(to_uri(file))
    say("Symbols from `#{file}`:")
    symbol_printer.print_objects(res)
  end
end
to_uri(path) click to toggle source
# File lib/spoom/cli/lsp.rb, line 159
def to_uri(path)
  "file://" + File.join(File.expand_path(exec_path), path)
end
types(file, line, col) click to toggle source

TODO: options, filter, limit, kind etc.. filter rbi

# File lib/spoom/cli/lsp.rb, line 103
def types(file, line, col)
  run do |client|
    res = client.type_definitions(to_uri(file), line.to_i, col.to_i)
    say("Type for `#{file}:#{line}:#{col}`:")
    symbol_printer.print_list(res)
  end
end