From 90f5b0c2d7c5d3deb76b5deb0ecc379023c4f299 Mon Sep 17 00:00:00 2001 From: Raphael Date: Sat, 3 Jun 2023 15:08:57 +0800 Subject: fix(rust_analyzer): check file is library (#2645) --- lua/lspconfig/server_configurations/rust_analyzer.lua | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'lua/lspconfig/server_configurations/rust_analyzer.lua') diff --git a/lua/lspconfig/server_configurations/rust_analyzer.lua b/lua/lspconfig/server_configurations/rust_analyzer.lua index 6d2ab33d..ea84a07a 100644 --- a/lua/lspconfig/server_configurations/rust_analyzer.lua +++ b/lua/lspconfig/server_configurations/rust_analyzer.lua @@ -48,11 +48,28 @@ local function get_workspace_dir(cmd) return stdout and stdout['workspace_root'] or nil end +local function is_library(fname) + local cargo_home = os.getenv 'CARGO_HOME' or util.path.join(vim.env.HOME, '.cargo') + local registry = util.path.join(cargo_home, 'registry', 'src') + local toolchains = util.path.join(vim.env.HOME, '.rustup', 'toolchains') + for _, item in ipairs { toolchains, registry } do + if fname:sub(1, #item) == item then + local clients = vim.lsp.get_active_clients { name = 'rust_analyzer' } + return clients[#clients].config.root_dir + end + end +end + return { default_config = { cmd = { 'rust-analyzer' }, filetypes = { 'rust' }, root_dir = function(fname) + local reuse_active = is_library(fname) + if reuse_active then + return reuse_active + end + local cargo_crate_dir = util.root_pattern 'Cargo.toml'(fname) local cmd = { 'cargo', 'metadata', '--no-deps', '--format-version', '1' } if cargo_crate_dir ~= nil then -- cgit v1.2.3-70-g09d2