summaryrefslogtreecommitdiff
path: root/start/lspconfig-0.1.3/lua/lspconfig/server_configurations/rust_analyzer.lua
diff options
context:
space:
mode:
authorMichael Smith <mikesmiffy128@gmail.com>2022-05-22 22:47:23 +0100
committerMichael Smith <mikesmiffy128@gmail.com>2022-05-22 22:47:23 +0100
commit95aea6b533e71e478d61d18fac71cca116c56a4d (patch)
tree1a1f42f723772258cc54551495826768f374474a /start/lspconfig-0.1.3/lua/lspconfig/server_configurations/rust_analyzer.lua
Add all the plugins I currently use
Diffstat (limited to 'start/lspconfig-0.1.3/lua/lspconfig/server_configurations/rust_analyzer.lua')
-rw-r--r--start/lspconfig-0.1.3/lua/lspconfig/server_configurations/rust_analyzer.lua79
1 files changed, 79 insertions, 0 deletions
diff --git a/start/lspconfig-0.1.3/lua/lspconfig/server_configurations/rust_analyzer.lua b/start/lspconfig-0.1.3/lua/lspconfig/server_configurations/rust_analyzer.lua
new file mode 100644
index 0000000..6331cf5
--- /dev/null
+++ b/start/lspconfig-0.1.3/lua/lspconfig/server_configurations/rust_analyzer.lua
@@ -0,0 +1,79 @@
+local util = require 'lspconfig.util'
+
+local function reload_workspace(bufnr)
+ bufnr = util.validate_bufnr(bufnr)
+ vim.lsp.buf_request(bufnr, 'rust-analyzer/reloadWorkspace', nil, function(err)
+ if err then
+ error(tostring(err))
+ end
+ vim.notify 'Cargo workspace reloaded'
+ end)
+end
+
+return {
+ default_config = {
+ cmd = { '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' }
+ if cargo_crate_dir ~= nil then
+ 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(_, d, _)
+ cargo_metadata = table.concat(d, '\n')
+ end,
+ on_stderr = function(_, d, _)
+ 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_workspace_dir = nil
+ if cm == 0 then
+ cargo_workspace_dir = vim.fn.json_decode(cargo_metadata)['workspace_root']
+ else
+ vim.notify(
+ string.format('[lspconfig] cmd (%q) failed:\n%s', table.concat(cmd, ' '), cargo_metadata_err),
+ vim.log.levels.WARN
+ )
+ end
+ return cargo_workspace_dir
+ or cargo_crate_dir
+ or util.root_pattern 'rust-project.json'(fname)
+ or util.find_git_ancestor(fname)
+ end,
+ settings = {
+ ['rust-analyzer'] = {},
+ },
+ },
+ commands = {
+ CargoReload = {
+ function()
+ reload_workspace(0)
+ end,
+ description = 'Reload current cargo workspace',
+ },
+ },
+ docs = {
+ description = [[
+https://github.com/rust-analyzer/rust-analyzer
+
+rust-analyzer (aka rls 2.0), a language server for Rust
+
+See [docs](https://github.com/rust-analyzer/rust-analyzer/tree/master/docs/user#settings) for extra settings.
+ ]],
+ default_config = {
+ root_dir = [[root_pattern("Cargo.toml", "rust-project.json")]],
+ },
+ },
+}