Class: Rigor::CLI::LspCommand

Inherits:
Command
  • Object
show all
Defined in:
lib/rigor/cli/lsp_command.rb

Overview

Executes the rigor lsp command.

Starts a long-running LSP server over stdio (JSON-RPC). See docs/design/20260517-language-server.md for the design.

Constant Summary collapse

USAGE =
"Usage: rigor lsp [options]"

Instance Method Summary collapse

Methods inherited from Command

#initialize

Constructor Details

This class inherits a constructor from Rigor::CLI::Command

Instance Method Details

#runInteger

Returns CLI exit status.

Returns:

  • (Integer)

    CLI exit status.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/rigor/cli/lsp_command.rb', line 18

def run
  options = parse_options
  return CLI::EXIT_USAGE if options == :usage_error

  transport = options.fetch(:transport)
  unless transport == "stdio"
    @err.puts("rigor lsp: unsupported transport: #{transport.inspect} (only `stdio` is supported in v1)")
    return CLI::EXIT_USAGE
  end

  require_relative "../language_server"
  require_relative "../configuration"
  require "language_server-protocol"

  # STDIN is read frame-by-frame via the gem's `Io::Reader`; STDOUT is wrapped in `SynchronizedWriter` so
  # concurrent writes from the main dispatch thread + the Debouncer's async threads don't interleave frames. The
  # Loop runs until either STDIN hits EOF or `server.exited?`; the process then exits with the server's recorded
  # code (0 after a clean shutdown+exit, 1 otherwise).
  writer = LanguageServer::SynchronizedWriter.new(
    ::LanguageServer::Protocol::Transport::Io::Writer.new($stdout)
  )
  server, loop_runner = build_server(writer: writer, config_path: options.fetch(:config))
  loop_runner.run
  server.exit_code || 0
end