mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	fix(diagnostic): fix float scope filtering (#29134)
This commit is contained in:
		| @@ -1857,16 +1857,19 @@ function M.open_float(opts, ...) | |||||||
|   if scope == 'line' then |   if scope == 'line' then | ||||||
|     --- @param d vim.Diagnostic |     --- @param d vim.Diagnostic | ||||||
|     diagnostics = vim.tbl_filter(function(d) |     diagnostics = vim.tbl_filter(function(d) | ||||||
|       return lnum >= d.lnum and lnum <= d.end_lnum |       return lnum >= d.lnum | ||||||
|  |         and lnum <= d.end_lnum | ||||||
|  |         and (d.lnum == d.end_lnum or lnum ~= d.end_lnum or d.end_col ~= 0) | ||||||
|     end, diagnostics) |     end, diagnostics) | ||||||
|   elseif scope == 'cursor' then |   elseif scope == 'cursor' then | ||||||
|     -- LSP servers can send diagnostics with `end_col` past the length of the line |     -- If `col` is past the end of the line, show if the cursor is on the last char in the line | ||||||
|     local line_length = #api.nvim_buf_get_lines(bufnr, lnum, lnum + 1, true)[1] |     local line_length = #api.nvim_buf_get_lines(bufnr, lnum, lnum + 1, true)[1] | ||||||
|     --- @param d vim.Diagnostic |     --- @param d vim.Diagnostic | ||||||
|     diagnostics = vim.tbl_filter(function(d) |     diagnostics = vim.tbl_filter(function(d) | ||||||
|       return d.lnum == lnum |       return lnum >= d.lnum | ||||||
|         and math.min(d.col, line_length - 1) <= col |         and lnum <= d.end_lnum | ||||||
|         and (d.end_col >= col or d.end_lnum > lnum) |         and (lnum ~= d.lnum or col >= math.min(d.col, line_length - 1)) | ||||||
|  |         and ((d.lnum == d.end_lnum and d.col == d.end_col) or lnum ~= d.end_lnum or col < d.end_col) | ||||||
|     end, diagnostics) |     end, diagnostics) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2291,6 +2291,38 @@ describe('vim.diagnostic', function() | |||||||
|         return lines |         return lines | ||||||
|       ]] |       ]] | ||||||
|       ) |       ) | ||||||
|  |  | ||||||
|  |       -- End position is exclusive | ||||||
|  |       eq( | ||||||
|  |         vim.NIL, | ||||||
|  |         exec_lua [[ | ||||||
|  |         local diagnostics = { | ||||||
|  |           make_error("Syntax error", 1, 1, 2, 0), | ||||||
|  |         } | ||||||
|  |         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) | ||||||
|  |         vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics) | ||||||
|  |         vim.api.nvim_win_set_cursor(0, {1, 1}) | ||||||
|  |         local _, winnr = vim.diagnostic.open_float(0, {header=false, pos={2,0}}) | ||||||
|  |         return winnr | ||||||
|  |       ]] | ||||||
|  |       ) | ||||||
|  |  | ||||||
|  |       -- Works when width == 0 | ||||||
|  |       eq( | ||||||
|  |         { '1. Syntax error' }, | ||||||
|  |         exec_lua [[ | ||||||
|  |         local diagnostics = { | ||||||
|  |           make_error("Syntax error", 2, 0, 2, 0), | ||||||
|  |         } | ||||||
|  |         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) | ||||||
|  |         vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics) | ||||||
|  |         vim.api.nvim_win_set_cursor(0, {1, 1}) | ||||||
|  |         local float_bufnr, winnr = vim.diagnostic.open_float(0, {header=false, pos={2,1}}) | ||||||
|  |         local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false) | ||||||
|  |         vim.api.nvim_win_close(winnr, true) | ||||||
|  |         return lines | ||||||
|  |       ]] | ||||||
|  |       ) | ||||||
|     end) |     end) | ||||||
|  |  | ||||||
|     it('can show diagnostics from a specific position', function() |     it('can show diagnostics from a specific position', function() | ||||||
| @@ -2299,7 +2331,7 @@ describe('vim.diagnostic', function() | |||||||
|         { 'Syntax error' }, |         { 'Syntax error' }, | ||||||
|         exec_lua [[ |         exec_lua [[ | ||||||
|         local diagnostics = { |         local diagnostics = { | ||||||
|           make_error("Syntax error", 1, 1, 1, 2), |           make_error("Syntax error", 1, 1, 1, 3), | ||||||
|           make_warning("Some warning", 1, 3, 1, 4), |           make_warning("Some warning", 1, 3, 1, 4), | ||||||
|         } |         } | ||||||
|         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) |         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) | ||||||
| @@ -2317,7 +2349,7 @@ describe('vim.diagnostic', function() | |||||||
|         { 'Some warning' }, |         { 'Some warning' }, | ||||||
|         exec_lua [[ |         exec_lua [[ | ||||||
|         local diagnostics = { |         local diagnostics = { | ||||||
|           make_error("Syntax error", 1, 1, 1, 2), |           make_error("Syntax error", 1, 1, 1, 3), | ||||||
|           make_warning("Some warning", 1, 3, 1, 4), |           make_warning("Some warning", 1, 3, 1, 4), | ||||||
|         } |         } | ||||||
|         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) |         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) | ||||||
| @@ -2347,6 +2379,38 @@ describe('vim.diagnostic', function() | |||||||
|         return lines |         return lines | ||||||
|       ]] |       ]] | ||||||
|       ) |       ) | ||||||
|  |  | ||||||
|  |       -- End position is exclusive | ||||||
|  |       eq( | ||||||
|  |         vim.NIL, | ||||||
|  |         exec_lua [[ | ||||||
|  |         local diagnostics = { | ||||||
|  |           make_error("Syntax error", 1, 1, 1, 3), | ||||||
|  |         } | ||||||
|  |         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) | ||||||
|  |         vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics) | ||||||
|  |         vim.api.nvim_win_set_cursor(0, {1, 1}) | ||||||
|  |         local _, winnr = vim.diagnostic.open_float(0, {header=false, scope="cursor", pos={1,3}}) | ||||||
|  |         return winnr | ||||||
|  |       ]] | ||||||
|  |       ) | ||||||
|  |  | ||||||
|  |       -- Works when width == 0 | ||||||
|  |       eq( | ||||||
|  |         { 'Syntax error' }, | ||||||
|  |         exec_lua [[ | ||||||
|  |         local diagnostics = { | ||||||
|  |           make_error("Syntax error", 2, 0, 2, 0), | ||||||
|  |         } | ||||||
|  |         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) | ||||||
|  |         vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics) | ||||||
|  |         vim.api.nvim_win_set_cursor(0, {1, 1}) | ||||||
|  |         local float_bufnr, winnr = vim.diagnostic.open_float({header=false, scope="cursor", pos={2,1}}) | ||||||
|  |         local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false) | ||||||
|  |         vim.api.nvim_win_close(winnr, true) | ||||||
|  |         return lines | ||||||
|  |       ]] | ||||||
|  |       ) | ||||||
|     end) |     end) | ||||||
|  |  | ||||||
|     it( |     it( | ||||||
| @@ -2755,20 +2819,32 @@ describe('vim.diagnostic', function() | |||||||
|     end) |     end) | ||||||
|  |  | ||||||
|     it('works for multi-line diagnostics #21949', function() |     it('works for multi-line diagnostics #21949', function() | ||||||
|       -- open float failed non diagnostic lnum |       -- create diagnostic | ||||||
|       eq( |  | ||||||
|         vim.NIL, |  | ||||||
|       exec_lua [[ |       exec_lua [[ | ||||||
|         local diagnostics = { |         local diagnostics = { | ||||||
|           make_error("Error in two lines lnum is 1 and end_lnum is 2", 1, 1, 2, 3), |           make_error("Error in two lines lnum is 1 and end_lnum is 2", 1, 1, 2, 3), | ||||||
|         } |         } | ||||||
|         local winids = {} |  | ||||||
|         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) |         vim.api.nvim_win_set_buf(0, diagnostic_bufnr) | ||||||
|         vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics) |         vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics) | ||||||
|  |       ]] | ||||||
|  |  | ||||||
|  |       -- open float failed non diagnostic lnum | ||||||
|  |       eq( | ||||||
|  |         vim.NIL, | ||||||
|  |         exec_lua [[ | ||||||
|  |         vim.api.nvim_win_set_cursor(0, {1, 0}) | ||||||
|         local _, winnr = vim.diagnostic.open_float(0, { header = false }) |         local _, winnr = vim.diagnostic.open_float(0, { header = false }) | ||||||
|         return winnr |         return winnr | ||||||
|       ]] |       ]] | ||||||
|       ) |       ) | ||||||
|  |       eq( | ||||||
|  |         vim.NIL, | ||||||
|  |         exec_lua [[ | ||||||
|  |         vim.api.nvim_win_set_cursor(0, {1, 0}) | ||||||
|  |         local _, winnr = vim.diagnostic.open_float(0, { header = false, scope = "cursor" }) | ||||||
|  |         return winnr | ||||||
|  |       ]] | ||||||
|  |       ) | ||||||
|  |  | ||||||
|       -- can open a float window on lnum 1 |       -- can open a float window on lnum 1 | ||||||
|       eq( |       eq( | ||||||
| @@ -2782,6 +2858,18 @@ describe('vim.diagnostic', function() | |||||||
|       ]] |       ]] | ||||||
|       ) |       ) | ||||||
|  |  | ||||||
|  |       -- can open a cursor-scoped float window on lnum 1 | ||||||
|  |       eq( | ||||||
|  |         { 'Error in two lines lnum is 1 and end_lnum is 2' }, | ||||||
|  |         exec_lua [[ | ||||||
|  |         vim.api.nvim_win_set_cursor(0, {2, 1}) | ||||||
|  |         local float_bufnr, winnr = vim.diagnostic.open_float(0, { header = false, scope = "cursor" }) | ||||||
|  |         local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false) | ||||||
|  |         vim.api.nvim_win_close(winnr, true) | ||||||
|  |         return lines | ||||||
|  |       ]] | ||||||
|  |       ) | ||||||
|  |  | ||||||
|       -- can open a float window on end_lnum 2 |       -- can open a float window on end_lnum 2 | ||||||
|       eq( |       eq( | ||||||
|         { '1. Error in two lines lnum is 1 and end_lnum is 2' }, |         { '1. Error in two lines lnum is 1 and end_lnum is 2' }, | ||||||
| @@ -2793,6 +2881,18 @@ describe('vim.diagnostic', function() | |||||||
|         return lines |         return lines | ||||||
|       ]] |       ]] | ||||||
|       ) |       ) | ||||||
|  |  | ||||||
|  |       -- can open a cursor-scoped float window on end_lnum 2 | ||||||
|  |       eq( | ||||||
|  |         { 'Error in two lines lnum is 1 and end_lnum is 2' }, | ||||||
|  |         exec_lua [[ | ||||||
|  |         vim.api.nvim_win_set_cursor(0, {3, 2}) | ||||||
|  |         local float_bufnr, winnr = vim.diagnostic.open_float(0, { header = false, scope = "cursor" }) | ||||||
|  |         local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false) | ||||||
|  |         vim.api.nvim_win_close(winnr, true) | ||||||
|  |         return lines | ||||||
|  |       ]] | ||||||
|  |       ) | ||||||
|     end) |     end) | ||||||
|   end) |   end) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Andre Toerien
					Andre Toerien