Skip to content
This repository has been archived by the owner on Jan 3, 2024. It is now read-only.

Commit

Permalink
fix: Fix running the standalone client
Browse files Browse the repository at this point in the history
* Move the starting to a VimEnter autocmd
* Update the root_dir() function with a modified version from
  nvim-lspconfig which doesn't print any errors
  • Loading branch information
simrat39 committed Oct 12, 2021
1 parent 4a9c749 commit c9f5504
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 82 deletions.
42 changes: 32 additions & 10 deletions lua/rust-tools.lua
Original file line number Diff line number Diff line change
Expand Up @@ -118,16 +118,28 @@ local function setup_lsp()
nvim_lsp.rust_analyzer.setup(config.options.server)
end

local function get_root_dir()
local fname = vim.api.nvim_buf_get_name(0)
local function get_root_dir(filename)
local fname = filename or vim.api.nvim_buf_get_name(0)
local cargo_crate_dir = lspconfig_utils.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 " .. lspconfig_utils.path.join(cargo_crate_dir, "Cargo.toml")
cmd[#cmd + 1] = "--manifest-path"
cmd[#cmd + 1] = lspconfig_utils.path.join(cargo_crate_dir, "Cargo.toml")
end
local cargo_metadata = ""
local cm = vim.fn.jobstart(cmd, {
on_stdout = function(_, d, _)
cargo_metadata = table.concat(d, "\n")
end,
stdout_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"]
end
return cargo_workspace_dir
Expand All @@ -136,12 +148,26 @@ local function get_root_dir()
or lspconfig_utils.find_git_ancestor(fname)
end

local function setup_root_dir()
local lsp_opts = config.options.server
lsp_opts.root_dir = get_root_dir
end

function M.start_standalone_if_required()
local current_buf = vim.api.nvim_get_current_buf()
if utils.is_bufnr_rust(current_buf) and (get_root_dir() == nil) then
require("rust-tools.standalone").start_standalone_client()
end
end

function M.setup(opts)
config.setup(opts)

setup_capabilities()
-- setup on_init
setup_on_init()
-- setup root_dir
setup_root_dir()
-- setup handlers
setup_handlers()
-- setup user commands
Expand All @@ -154,10 +180,6 @@ function M.setup(opts)
require("rust-tools.inlay_hints").setup_autocmd()
end

if utils.is_bufnr_rust(0) and (get_root_dir() == nil) then
require("rust-tools.standalone").start_standalone_client()
end

if pcall(require, "dap") then
rt_dap.setup_adapter()
end
Expand Down
61 changes: 30 additions & 31 deletions lua/rust-tools/standalone.lua
Original file line number Diff line number Diff line change
@@ -1,39 +1,38 @@
local ra_config = require 'rust-tools.config'
local ra_config = require("rust-tools.config")

local M = {}

function M.start_standalone_client()
local config = {
root_dir = require('lspconfig.util').path.dirname(
vim.api.nvim_buf_get_name(0)),
capabilities = ra_config.options.server.capabilities,
cmd = {'rust-analyzer'},
init_options = {detachedFiles = {vim.api.nvim_buf_get_name(0)}},
on_init = function(client)
vim.lsp.buf_attach_client(0, client.id)
vim.cmd "command! RustSetInlayHints :lua require('rust-tools.inlay_hints').set_inlay_hints()"
vim.cmd "command! RustDisableInlayHints :lua require('rust-tools.inlay_hints').disable_inlay_hints()"
vim.cmd "command! RustToggleInlayHints :lua require('rust-tools.inlay_hints').toggle_inlay_hints()"
vim.cmd "command! RustExpandMacro :lua require('rust-tools.expand_macro').expand_macro()"
vim.cmd "command! RustJoinLines :lua require('rust-tools.join_lines').join_lines()"
vim.cmd "command! RustHoverActions :lua require('rust-tools.hover_actions').hover_actions()"
vim.cmd "command! RustMoveItemDown :lua require('rust-tools.move_item').move_item()"
vim.cmd "command! RustMoveItemUp :lua require('rust-tools.move_item').move_item(true)"
end,
on_exit = function()
vim.cmd "delcommand RustSetInlayHints"
vim.cmd "delcommand RustDisableInlayHints"
vim.cmd "delcommand RustToggleInlayHints"
vim.cmd "delcommand RustExpandMacro"
vim.cmd "delcommand RustJoinLines"
vim.cmd "delcommand RustHoverActions"
vim.cmd "delcommand RustMoveItemDown"
vim.cmd "delcommand RustMoveItemUp"
end,
handlers = ra_config.options.server.handlers,
}
local config = {
root_dir = require("lspconfig.util").path.dirname(vim.api.nvim_buf_get_name(0)),
capabilities = ra_config.options.server.capabilities,
cmd = { "rust-analyzer" },
init_options = { detachedFiles = { vim.api.nvim_buf_get_name(0) } },
on_init = function(client)
vim.lsp.buf_attach_client(0, client.id)
vim.cmd("command! RustSetInlayHints :lua require('rust-tools.inlay_hints').set_inlay_hints()")
vim.cmd("command! RustDisableInlayHints :lua require('rust-tools.inlay_hints').disable_inlay_hints()")
vim.cmd("command! RustToggleInlayHints :lua require('rust-tools.inlay_hints').toggle_inlay_hints()")
vim.cmd("command! RustExpandMacro :lua require('rust-tools.expand_macro').expand_macro()")
vim.cmd("command! RustJoinLines :lua require('rust-tools.join_lines').join_lines()")
vim.cmd("command! RustHoverActions :lua require('rust-tools.hover_actions').hover_actions()")
vim.cmd("command! RustMoveItemDown :lua require('rust-tools.move_item').move_item()")
vim.cmd("command! RustMoveItemUp :lua require('rust-tools.move_item').move_item(true)")
end,
on_exit = function()
vim.cmd("delcommand RustSetInlayHints")
vim.cmd("delcommand RustDisableInlayHints")
vim.cmd("delcommand RustToggleInlayHints")
vim.cmd("delcommand RustExpandMacro")
vim.cmd("delcommand RustJoinLines")
vim.cmd("delcommand RustHoverActions")
vim.cmd("delcommand RustMoveItemDown")
vim.cmd("delcommand RustMoveItemUp")
end,
handlers = ra_config.options.server.handlers,
}

vim.lsp.start_client(config)
vim.lsp.start_client(config)
end

return M
85 changes: 44 additions & 41 deletions lua/rust-tools/utils/utils.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,76 +3,79 @@ local vim = vim
local M = {}

function M.delete_buf(bufnr)
if bufnr ~= nil then vim.api.nvim_buf_delete(bufnr, {force = true}) end
if bufnr ~= nil then
vim.api.nvim_buf_delete(bufnr, { force = true })
end
end

function M.split(vertical, bufnr)
local cmd = vertical and "vsplit" or "split"
local cmd = vertical and "vsplit" or "split"

vim.cmd(cmd)
local win = vim.api.nvim_get_current_win()
vim.api.nvim_win_set_buf(win, bufnr)
vim.cmd(cmd)
local win = vim.api.nvim_get_current_win()
vim.api.nvim_win_set_buf(win, bufnr)
end

function M.resize(vertical, amount)
local cmd = vertical and "vertical resize " or "resize"
cmd = cmd .. amount
local cmd = vertical and "vertical resize " or "resize"
cmd = cmd .. amount

vim.cmd(cmd)
vim.cmd(cmd)
end

function M.override_apply_text_edits()
local old_func = vim.lsp.util.apply_text_edits
vim.lsp.util.apply_text_edits = function (edits, bufnr)
M.snippet_text_edits_to_text_edits(edits)
old_func(edits, bufnr)
end
local old_func = vim.lsp.util.apply_text_edits
vim.lsp.util.apply_text_edits = function(edits, bufnr)
M.snippet_text_edits_to_text_edits(edits)
old_func(edits, bufnr)
end
end

function M.snippet_text_edits_to_text_edits(spe)
for _, value in ipairs(spe) do
if value.newText and value.insertTextFormat then
value.newText = string.gsub(value.newText, "%$%d", "");
end
end
for _, value in ipairs(spe) do
if value.newText and value.insertTextFormat then
value.newText = string.gsub(value.newText, "%$%d", "")
end
end
end

function M.is_bufnr_rust(bufnr)
return vim.api.nvim_buf_get_option(bufnr, 'ft') == 'rust'
local ret = vim.api.nvim_buf_get_option(bufnr, "ft") == "rust"
return ret
end

function M.contains(list, item)
for _, val in ipairs(list) do
if item == val then
return true
end
end
return false
for _, val in ipairs(list) do
if item == val then
return true
end
end
return false
end

-- callback args changed in Neovim 0.5.1/0.6. See:
-- https://github.com/neovim/neovim/pull/15504
function M.mk_handler(fn)
return function(...)
local config_or_client_id = select(4, ...)
local is_new = type(config_or_client_id) ~= "number"
if is_new then
fn(...)
else
local err = select(1, ...)
local method = select(2, ...)
local result = select(3, ...)
local client_id = select(4, ...)
local bufnr = select(5, ...)
local config = select(6, ...)
fn(err, result, { method = method, client_id = client_id, bufnr = bufnr }, config)
end
end
return function(...)
local config_or_client_id = select(4, ...)
local is_new = type(config_or_client_id) ~= "number"
if is_new then
fn(...)
else
local err = select(1, ...)
local method = select(2, ...)
local result = select(3, ...)
local client_id = select(4, ...)
local bufnr = select(5, ...)
local config = select(6, ...)
fn(err, result, { method = method, client_id = client_id, bufnr = bufnr }, config)
end
end
end

-- from mfussenegger/nvim-lsp-compl@29a81f3
function M.request(bufnr, method, params, handler)
return vim.lsp.buf_request(bufnr, method, params, M.mk_handler(handler))
return vim.lsp.buf_request(bufnr, method, params, M.mk_handler(handler))
end

return M
1 change: 1 addition & 0 deletions plugin/rust-tools.vim
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
autocmd BufWritePost */Cargo.toml lua require('rust-tools/workspace_refresh')._reload_workspace_from_cargo_toml()
au VimEnter *.rs lua require('rust-tools').start_standalone_if_required()

0 comments on commit c9f5504

Please sign in to comment.