diff --git a/home/editors/neovim/lsp/lsp.lua b/home/editors/neovim/lsp/lsp.lua index a39c471..4c62669 100644 --- a/home/editors/neovim/lsp/lsp.lua +++ b/home/editors/neovim/lsp/lsp.lua @@ -40,6 +40,22 @@ end local config = require("lspconfig") local configs = require("lspconfig.configs") +function table.merge(t1, t2) + local t = {} + for k, v in ipairs(t1) do table.insert(t, v) end + for k, v in ipairs(t2) do table.insert(t, v) end + return t +end + +-- first search git root for global config (monorepo) +-- and fall back to normal search order otherwise +local monorepo_pattern = function(main_patterns, other_patterns, f) + local all_patterns = table.merge(main_patterns, other_patterns) + local git_root = config.util.root_pattern(".git")(f) + local git_root_sln = config.util.root_pattern(unpack(main_patterns))(git_root) + return git_root_sln or config.util.root_pattern(unpack(all_patterns))(f) +end + if not configs.glslls then configs.glslls = { default_config = { @@ -78,10 +94,14 @@ config.glslls.setup(default_config) config.rust_analyzer.setup { on_attach = on_attach, capabilities = capabilities, - root_dir = config.util.root_pattern("Cargo.toml", "rust-project.json", ".git"), + root_dir = function(f) + return monorepo_pattern({ "Cargo.toml", "rust-project.json" }, { ".git" }, f) + end, settings = { ["rust-analyzer"] = { + cargo = { buildScripts = { enable = true } }, checkOnSave = { command = "clippy" }, + procMacro = { enable = true }, }, }, } @@ -90,9 +110,7 @@ config.omnisharp.setup { on_attach = on_attach, capabilities = capabilities, root_dir = function(f) - local git_root = config.util.root_pattern(".git")(f) - local git_root_sln = config.util.root_pattern("*.sln")(git_root) - return git_root_sln or config.util.root_pattern("*.sln", "*.csproj")(f) + return monorepo_pattern({ "*.sln" }, { "*.csproj" }, f) end, cmd = { "OmniSharp", "--languageserver", "--hostPID", tostring(pid) }, }