summaryrefslogtreecommitdiff
path: root/start/lspconfig-0.1.8/lua/lspconfig/server_configurations/rust_analyzer.lua
diff options
context:
space:
mode:
Diffstat (limited to 'start/lspconfig-0.1.8/lua/lspconfig/server_configurations/rust_analyzer.lua')
-rw-r--r--start/lspconfig-0.1.8/lua/lspconfig/server_configurations/rust_analyzer.lua117
1 files changed, 117 insertions, 0 deletions
diff --git a/start/lspconfig-0.1.8/lua/lspconfig/server_configurations/rust_analyzer.lua b/start/lspconfig-0.1.8/lua/lspconfig/server_configurations/rust_analyzer.lua
new file mode 100644
index 0000000..61dfdc1
--- /dev/null
+++ b/start/lspconfig-0.1.8/lua/lspconfig/server_configurations/rust_analyzer.lua
@@ -0,0 +1,117 @@
+local util = require 'lspconfig.util'
+local async = require 'lspconfig.async'
+
+local function reload_workspace(bufnr)
+ bufnr = util.validate_bufnr(bufnr)
+ local clients = util.get_lsp_clients { bufnr = bufnr, name = 'rust_analyzer' }
+ for _, client in ipairs(clients) do
+ vim.notify 'Reloading Cargo Workspace'
+ client.request('rust-analyzer/reloadWorkspace', nil, function(err)
+ if err then
+ error(tostring(err))
+ end
+ vim.notify 'Cargo workspace reloaded'
+ end, 0)
+ end
+end
+
+local function is_library(fname)
+ local user_home = util.path.sanitize(vim.env.HOME)
+ local cargo_home = os.getenv 'CARGO_HOME' or util.path.join(user_home, '.cargo')
+ local registry = util.path.join(cargo_home, 'registry', 'src')
+ local git_registry = util.path.join(cargo_home, 'git', 'checkouts')
+
+ local rustup_home = os.getenv 'RUSTUP_HOME' or util.path.join(user_home, '.rustup')
+ local toolchains = util.path.join(rustup_home, 'toolchains')
+
+ for _, item in ipairs { toolchains, registry, git_registry } do
+ if util.path.is_descendant(item, fname) then
+ local clients = util.get_lsp_clients { name = 'rust_analyzer' }
+ return #clients > 0 and clients[#clients].config.root_dir or nil
+ end
+ end
+end
+
+local function register_cap()
+ local capabilities = vim.lsp.protocol.make_client_capabilities()
+ capabilities.experimental = {
+ serverStatusNotification = true,
+ }
+ return capabilities
+end
+
+return {
+ default_config = {
+ cmd = { 'rust-analyzer' },
+ filetypes = { 'rust' },
+ single_file_support = true,
+ 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 cargo_workspace_root
+
+ if cargo_crate_dir ~= nil then
+ local cmd = {
+ 'cargo',
+ 'metadata',
+ '--no-deps',
+ '--format-version',
+ '1',
+ '--manifest-path',
+ util.path.join(cargo_crate_dir, 'Cargo.toml'),
+ }
+
+ local result = async.run_command(cmd)
+
+ if result and result[1] then
+ result = vim.json.decode(table.concat(result, ''))
+ if result['workspace_root'] then
+ cargo_workspace_root = util.path.sanitize(result['workspace_root'])
+ end
+ end
+ end
+
+ return cargo_workspace_root
+ or cargo_crate_dir
+ or util.root_pattern 'rust-project.json'(fname)
+ or util.find_git_ancestor(fname)
+ end,
+ capabilities = register_cap(),
+ },
+ commands = {
+ CargoReload = {
+ function()
+ reload_workspace(0)
+ end,
+ description = 'Reload current cargo workspace',
+ },
+ },
+ docs = {
+ description = [[
+https://github.com/rust-lang/rust-analyzer
+
+rust-analyzer (aka rls 2.0), a language server for Rust
+
+
+See [docs](https://github.com/rust-lang/rust-analyzer/blob/master/docs/user/generated_config.adoc) for extra settings. The settings can be used like this:
+```lua
+require'lspconfig'.rust_analyzer.setup{
+ settings = {
+ ['rust-analyzer'] = {
+ diagnostics = {
+ enable = false;
+ }
+ }
+ }
+}
+```
+ ]],
+ default_config = {
+ root_dir = [[root_pattern("Cargo.toml", "rust-project.json")]],
+ },
+ },
+}