Rand Stats

Nimala::Raku-LSP

zef:kliklamala

Nimala Logo

NAME

Nimala::Raku-LSP - Complete Raku Language Server Protocol (LSP 3.18) & Debug Adapter Protocol (DAP)

DESCRIPTION

Nimala is a full-featured Language Server Protocol (LSP 3.18) and Debug Adapter Protocol (DAP) implementation for the Raku programming language, written entirely in Raku. It provides advanced IDE intelligence, refactoring capabilities, and integrated debugging to any LSP-compatible editor (such as VS Code, Neovim, Helix, or Emacs).

Key Highlights

LSP 3.18 Implementation Matrix

MethodSpecificationStatus
B<1. Lifecycle & General>|
C<initialize>L<initialize|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#initialize>[x] done
C<initialized>L<initialized|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#initialized>[x] done
C<shutdown>L<shutdown|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#shutdown>[x] done
C<exit>L<exit|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#exit>[x] done
C<$/cancelRequest>L<cancelRequest|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#cancelRequest>[x] done
C<$/progress>L<progress|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#progress>[x] done
B<2. Document Synchronization>|
C<textDocument/didOpen>L<didOpen|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_didOpen>[x] done
C<textDocument/didChange>L<didChange|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_didChange>[x] done
C<textDocument/willSave>L<willSave|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_willSave>[x] done
C<textDocument/didSave>L<didSave|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_didSave>[x] done
C<textDocument/didClose>L<didClose|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_didClose>[x] done
B<3. Diagnostics & Code Intelligence>|
C<textDocument/publishDiagnostics>L<publishDiagnostics|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_publishDiagnostics>[x] done
C<textDocument/diagnostic>L<pullDiagnostics|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_diagnostic>[x] done
C<workspace/diagnostic>L<workspacePullDiagnostics|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_diagnostic>[x] done
C<textDocument/completion>L<completion|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_completion>[x] done
C<completionItem/resolve>L<completionItem_resolve|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#completionItem_resolve>[x] done
C<textDocument/inlineCompletion>L<inlineCompletion|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#textDocument_inlineCompletion>[x] done
C<textDocument/hover>L<hover|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_hover>[x] done
C<textDocument/signatureHelp>L<signatureHelp|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_signatureHelp>[x] done
C<textDocument/definition>L<definition|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_definition>[x] done
C<textDocument/declaration>L<declaration|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_declaration>[x] done
C<textDocument/typeDefinition>L<typeDefinition|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_typeDefinition>[x] done
C<textDocument/implementation>L<implementation|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_implementation>[x] done
C<textDocument/references>L<references|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_references>[x] done
C<textDocument/documentHighlight>L<documentHighlight|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_documentHighlight>[x] done
C<textDocument/documentSymbol>L<documentSymbol|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_documentSymbol>[x] done
C<textDocument/codeAction>L<codeAction|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_codeAction>[x] done
C<codeAction/resolve>L<codeAction_resolve|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeAction_resolve>[x] done
C<textDocument/codeLens>L<codeLens|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_codeLens>[x] done
C<codeLens/resolve>L<codeLens_resolve|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeLens_resolve>[x] done
C<textDocument/documentLink>L<documentLink|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_documentLink>[x] done
C<documentLink/resolve>L<documentLink_resolve|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#documentLink_resolve>[x] done
C<textDocument/formatting>L<formatting|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_formatting>[x] done
C<textDocument/rangeFormatting>L<rangeFormatting|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_rangeFormatting>[x] done
C<textDocument/onTypeFormatting>L<onTypeFormatting|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_onTypeFormatting>[x] done
C<textDocument/rename>L<rename|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_rename>[x] done
C<textDocument/prepareRename>L<prepareRename|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_prepareRename>[x] done
C<textDocument/foldingRange>L<foldingRange|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_foldingRange>[x] done
C<textDocument/selectionRange>L<selectionRange|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_selectionRange>[x] done
C<textDocument/inlayHint>L<inlayHint|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_inlayHint>[x] done
C<inlayHint/resolve>L<inlayHint_resolve|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#inlayHint_resolve>[x] done
C<textDocument/inlineValue>L<inlineValue|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_inlineValue>[x] done
C<textDocument/linkedEditingRange>L<linkedEditingRange|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_linkedEditingRange>[x] done
C<textDocument/semanticTokens/full>L<semanticTokens|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_semanticTokens>[x] done
B<4. Hierarchies>|
C<textDocument/prepareTypeHierarchy>L<prepareTypeHierarchy|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_prepareTypeHierarchy>[x] done
C<typeHierarchy/supertypes>L<supertypes|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#typeHierarchy_supertypes>[x] done
C<typeHierarchy/subtypes>L<subtypes|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#typeHierarchy_subtypes>[x] done
C<textDocument/prepareCallHierarchy>L<prepareCallHierarchy|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_prepareCallHierarchy>[x] done
C<callHierarchy/incomingCalls>L<incomingCalls|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#callHierarchy_incomingCalls>[x] done
C<callHierarchy/outgoingCalls>L<outgoingCalls|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#callHierarchy_outgoingCalls>[x] done
B<5. Workspace & Refreshes>|
C<workspace/symbol>L<symbol|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_symbol>[x] done
C<workspace/executeCommand>L<executeCommand|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_executeCommand>[x] done
C<workspace/didChangeWatchedFiles>L<didChangeWatchedFiles|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_didChangeWatchedFiles>[x] done
C<workspace/workspaceFolders>L<workspaceFolders|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_workspaceFolders>[x] done
C<workspace/didChangeWorkspaceFolders>L<didChangeWorkspaceFolders|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_didChangeWorkspaceFolders>[x] done
C<workspace/didChangeConfiguration>L<didChangeConfiguration|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_didChangeConfiguration>[x] done
C<workspace/willRenameFiles>L<willRenameFiles|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_willRenameFiles>[x] done
C<workspace/applyEdit>L<applyEdit|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_applyEdit>[x] done
C<workspace/codeLens/refresh>L<codeLens_refresh|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_codeLens_refresh>[x] done
C<workspace/inlayHint/refresh>L<inlayHint_refresh|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_inlayHint_refresh>[x] done
C<workspace/semanticTokens/refresh>L<semanticTokens_refresh|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_semanticTokens_refresh>[x] done
C<workspace/foldingRange/refresh>L<foldingRange_refresh|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#workspace_foldingRange_refresh>[x] done
C<workspace/diagnostic/refresh>L<diagnostic_refresh|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_diagnostic_refresh>[x] done
C<workspace/inlineValue/refresh>L<inlineValue_refresh|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_inlineValue_refresh>[x] done
B<6. Window & Client Interaction>|
C<window/showMessage>L<showMessage|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#window_showMessage>[x] done
C<window/showMessageRequest>L<showMessageRequest|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#window_showMessageRequest>[x] done
C<window/logMessage>L<logMessage|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#window_logMessage>[x] done
C<window/showDocument>L<showDocument|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#window_showDocument>[x] done
C<window/workDoneProgress/create>L<workDoneProgress/create|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#window_workDoneProgress_create>[x] done
C<window/workDoneProgress/cancel>L<workDoneProgress/cancel|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#window_workDoneProgress_cancel>[x] done
C<client/registerCapability>L<registerCapability|https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#client_registerCapability>[x] done

Programmatic Usage

The server binary dispatches JSON-RPC through its own Nimala::Raku-LSP::Dispatcher (method whitelist, cancellation, concurrent requests). For embedding, the handler can also be driven by JSON::RPC::Server, as the test suite does, to analyze Raku code or build custom clients:

use Nimala::Raku-LSP::Handler;
use JSON::RPC::Server;

# Initialize the LSP Handler
my $handler = Nimala::Raku-LSP::Handler.new;

# Wrap it in a JSON-RPC Server
my $server = JSON::RPC::Server.new(application => $handler);

# Simulate a JSON-RPC Request (e.g., from a client)
my $request = q:to/END/;
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "processId": null,
    "rootUri": null,
    "capabilities": {}
  }
}
END

# Process the request and get the JSON-RPC response
my $response = $server.handler($request);
say $response;

Debug Adapter Protocol (DAP) Architecture

Nimala includes a Debug Adapter Protocol (DAP) server (bin/nimala-raku-dap). The debugger is built directly on MoarVM's native remote debugging protocol, communicating with the debuggee over loopback TCP using MessagePack framing.

For full architectural details, see docs/DEBUG.md and docs/DEBUG-MOARVM.md.

Installation & Dependencies

Nimala requires a working Raku installation (Rakudo 2026.09 recommended) and the sqlite3 shared library for index persistence. Only Rakudo 2026.09 is tested. Rakudo 2024.07 runs with limitations: the debugger can abort with a MoarVM panic, and the RakuAST-based analysis ignores signature parameters and fails on files with BEGIN blocks, so the built-in parser fills in.

Dependencies

Install via Zef

# Install all dependencies and Nimala LSP/DAP binaries
zef install Nimala::Raku-LSP

zef puts the nimala-raku-lsp and nimala-raku-dap scripts into the bin/ directory of the repository it installs to. Without root rights that is usually ~/.raku/bin, which must be in PATH (for example export PATH="$HOME/.raku/bin:$PATH" in ~/.bashrc). Otherwise editors cannot find the server.

Security Considerations

Like standard Raku tooling, the language server executes compile-time code when inspecting documents:

License Artistic-2.0

sub run-tcp-server

sub run-tcp-server(
    Str :$host = "127.0.0.1",
    Int :$port = 5007,
    Bool :$single-session = Bool::False,
    Promise :$stop-promise = Code.new
) returns Nil

Re-export run-tcp-server from Transport::Socket

sub run-server

sub run-server(
    IO::Handle :$in = Code.new,
    IO::Handle :$out = Code.new,
    Nimala::Raku-LSP::Handler :$handler = Code.new,
    :$supply = Code.new
) returns Int

Start the LSP server loop.