aboutsummaryrefslogtreecommitdiffstats
path: root/lua/lspconfig/rust_analyzer.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lspconfig/rust_analyzer.lua')
-rw-r--r--lua/lspconfig/rust_analyzer.lua30
1 files changed, 26 insertions, 4 deletions
diff --git a/lua/lspconfig/rust_analyzer.lua b/lua/lspconfig/rust_analyzer.lua
index 9ff8907f..1f47dc2b 100644
--- a/lua/lspconfig/rust_analyzer.lua
+++ b/lua/lspconfig/rust_analyzer.lua
@@ -18,14 +18,36 @@ configs.rust_analyzer = {
filetypes = { 'rust' },
root_dir = function(fname)
local cargo_crate_dir = util.root_pattern 'Cargo.toml'(fname)
- local cmd = 'cargo metadata --no-deps --format-version 1'
+ local cmd = { 'cargo', 'metadata', '--no-deps', '--format-version', '1' }
if cargo_crate_dir ~= nil then
- cmd = cmd .. ' --manifest-path ' .. util.path.join(cargo_crate_dir, 'Cargo.toml')
+ cmd[#cmd + 1] = '--manifest-path'
+ cmd[#cmd + 1] = util.path.join(cargo_crate_dir, 'Cargo.toml')
+ end
+ local cargo_metadata = ''
+ local cargo_metadata_err = ''
+ local cm = vim.fn.jobstart(cmd, {
+ on_stdout = function(j, d, e)
+ cargo_metadata = table.concat(d, '\n')
+ end,
+ on_stderr = function(j, d, e)
+ cargo_metadata_err = table.concat(d, '\n')
+ end,
+ stdout_buffered = true,
+ stderr_buffered = true,
+ })
+ if cm > 0 then
+ cm = vim.fn.jobwait({ cm })[1]
+ else
+ cm = -1
end
- local cargo_metadata = vim.fn.system(cmd)
local cargo_workspace_dir = nil
- if vim.v.shell_error == 0 then
+ if cm == 0 then
cargo_workspace_dir = vim.fn.json_decode(cargo_metadata)['workspace_root']
+ else
+ vim.notify(
+ string.format('cmd [%q] failed:\n%s', table.concat(cmd, ' '), cargo_metadata_err),
+ vim.log.levels.Warning
+ )
end
return cargo_workspace_dir
or cargo_crate_dir