aboutsummaryrefslogtreecommitdiffstats
path: root/lua/lspconfig/server_configurations/rust_analyzer.lua
diff options
context:
space:
mode:
authorMichael Lingelbach <m.j.lbach@gmail.com>2021-11-24 23:01:07 -0500
committerMichael Lingelbach <m.j.lbach@gmail.com>2021-11-25 23:46:21 -0500
commit6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e (patch)
tree7f2bf25ca5456b23304295dba8fe0005e85a5c10 /lua/lspconfig/server_configurations/rust_analyzer.lua
parentfix: only set cmd_cwd if filepath exists (#1485) (diff)
downloadnvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.gz
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.bz2
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.lz
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.xz
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.zst
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.zip
feat: expose configs
Diffstat (limited to 'lua/lspconfig/server_configurations/rust_analyzer.lua')
-rw-r--r--lua/lspconfig/server_configurations/rust_analyzer.lua80
1 files changed, 80 insertions, 0 deletions
diff --git a/lua/lspconfig/server_configurations/rust_analyzer.lua b/lua/lspconfig/server_configurations/rust_analyzer.lua
new file mode 100644
index 00000000..cd8c3aad
--- /dev/null
+++ b/lua/lspconfig/server_configurations/rust_analyzer.lua
@@ -0,0 +1,80 @@
+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('cmd [%q] failed:\n%s', table.concat(cmd, ' '), cargo_metadata_err),
+ vim.log.levels.Warning
+ )
+ 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 = {
+ package_json = 'https://raw.githubusercontent.com/rust-analyzer/rust-analyzer/master/editors/code/package.json',
+ 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")]],
+ },
+ },
+}