diff options
author | Evgeni Chasnovski <evgeni.chasnovski@gmail.com> | 2023-09-06 20:54:18 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-06 12:54:18 -0500 |
commit | d27214331815324ea5762b5aa22996b9019085c6 (patch) | |
tree | c8e6e9c287ff88e89013161073a72f34fa00a7b7 | |
parent | 2ef7b6a433c61837bcef0fca297a665551835423 (diff) | |
download | rneovim-d27214331815324ea5762b5aa22996b9019085c6.tar.gz rneovim-d27214331815324ea5762b5aa22996b9019085c6.tar.bz2 rneovim-d27214331815324ea5762b5aa22996b9019085c6.zip |
fix(diagnostic): always return copies of diagnostic items (#25010)
-rw-r--r-- | runtime/doc/diagnostic.txt | 3 | ||||
-rw-r--r-- | runtime/lua/vim/diagnostic.lua | 4 | ||||
-rw-r--r-- | test/functional/lua/diagnostic_spec.lua | 12 |
3 files changed, 18 insertions, 1 deletions
diff --git a/runtime/doc/diagnostic.txt b/runtime/doc/diagnostic.txt index d0aa538011..866c32722a 100644 --- a/runtime/doc/diagnostic.txt +++ b/runtime/doc/diagnostic.txt @@ -480,6 +480,9 @@ fromqflist({list}) *vim.diagnostic.fromqflist()* get({bufnr}, {opts}) *vim.diagnostic.get()* Get current diagnostics. + Modifying diagnostics in the returned table has no effect. To set + diagnostics in a buffer, use |vim.diagnostic.set()|. + Parameters: ~ • {bufnr} (integer|nil) Buffer number to get diagnostics from. Use 0 for current buffer or nil for all buffers. diff --git a/runtime/lua/vim/diagnostic.lua b/runtime/lua/vim/diagnostic.lua index 96d1cb7629..a1f3020c88 100644 --- a/runtime/lua/vim/diagnostic.lua +++ b/runtime/lua/vim/diagnostic.lua @@ -386,6 +386,7 @@ local function get_diagnostics(bufnr, opts, clamp) local function add(b, d) if not opts.lnum or d.lnum == opts.lnum then + d = vim.deepcopy(d) if clamp and api.nvim_buf_is_loaded(b) then local line_count = buf_line_count[b] - 1 if @@ -396,7 +397,6 @@ local function get_diagnostics(bufnr, opts, clamp) or d.col < 0 or d.end_col < 0 then - d = vim.deepcopy(d) d.lnum = math.max(math.min(d.lnum, line_count), 0) d.end_lnum = math.max(math.min(d.end_lnum, line_count), 0) d.col = math.max(d.col, 0) @@ -750,6 +750,8 @@ end --- Get current diagnostics. --- +--- Modifying diagnostics in the returned table has no effect. To set diagnostics in a buffer, use |vim.diagnostic.set()|. +--- ---@param bufnr integer|nil Buffer number to get diagnostics from. Use 0 for --- current buffer or nil for all buffers. ---@param opts table|nil A table with the following keys: diff --git a/test/functional/lua/diagnostic_spec.lua b/test/functional/lua/diagnostic_spec.lua index 27ba70f057..8deb2e0726 100644 --- a/test/functional/lua/diagnostic_spec.lua +++ b/test/functional/lua/diagnostic_spec.lua @@ -181,6 +181,18 @@ describe('vim.diagnostic', function() eq(0, #diagnostics) end) + it('always returns a copy of diagnostic tables', function() + local result = exec_lua [[ + vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, { + make_error('Diagnostic #1', 1, 1, 1, 1), + }) + local diag = vim.diagnostic.get() + diag[1].col = 10000 + return vim.diagnostic.get()[1].col == 10000 + ]] + eq(result, false) + end) + it('resolves buffer number 0 to the current buffer', function() eq(2, exec_lua [[ vim.api.nvim_set_current_buf(diagnostic_bufnr) |