diff --git a/pkgs/development/tools/rust/rust-analyzer/default.nix b/pkgs/development/tools/rust/rust-analyzer/default.nix index ce07a3973f9..861a4075990 100644 --- a/pkgs/development/tools/rust/rust-analyzer/default.nix +++ b/pkgs/development/tools/rust/rust-analyzer/default.nix @@ -1,5 +1,6 @@ { lib , stdenv +, callPackage , fetchFromGitHub , rustPlatform , CoreServices @@ -54,7 +55,11 @@ rustPlatform.buildRustPackage rec { runHook postInstallCheck ''; - passthru.updateScript = ./update.sh; + passthru = { + updateScript = ./update.sh; + # FIXME: Pass overrided `rust-analyzer` once `buildRustPackage` also implements #119942 + tests.neovim-lsp = callPackage ./test-neovim-lsp.nix { }; + }; meta = with lib; { description = "A modular compiler frontend for the Rust language"; diff --git a/pkgs/development/tools/rust/rust-analyzer/test-neovim-lsp.nix b/pkgs/development/tools/rust/rust-analyzer/test-neovim-lsp.nix new file mode 100644 index 00000000000..6782a7418a6 --- /dev/null +++ b/pkgs/development/tools/rust/rust-analyzer/test-neovim-lsp.nix @@ -0,0 +1,49 @@ +{ runCommandNoCC, cargo, neovim, rust-analyzer, rustc }: +runCommandNoCC "test-neovim-rust-analyzer" { + nativeBuildInputs = [ cargo neovim rust-analyzer rustc ]; + + testRustSrc = /* rust */ '' + fn main() { + let mut var = vec![None]; + var.push(Some("hello".to_owned())); + } + ''; + + nvimConfig = /* lua */ '' + vim.lsp.buf_attach_client(vim.api.nvim_get_current_buf(), vim.lsp.start_client({ + cmd = { "rust-analyzer" }, + handlers = { + ["$/progress"] = function(_, msg, ctx) + if msg.token == "rustAnalyzer/Indexing" and msg.value.kind == "end" then + vim.cmd("goto 23") -- let mut |var =... + vim.lsp.buf.hover() + end + end, + ["textDocument/hover"] = function(_, msg, ctx) + -- Keep newlines. + io.write(msg.contents.value) + vim.cmd("q") + end, + }, + on_error = function(code) + print("error: " .. code) + vim.cmd("q") + end + })) + ''; + +} '' + # neovim requires a writable HOME. + export HOME="$(pwd)" + + cargo new --bin test-rust-analyzer + cd test-rust-analyzer + cat <<<"$testRustSrc" >src/main.rs + cat <<<"$nvimConfig" >script.lua + + # `-u` doesn't work + result="$(nvim --headless +'lua dofile("script.lua")' src/main.rs)" + echo "$result" + [[ "$result" == *"var: Vec>"* ]] + touch $out +''