mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	fix(lsp): create codelens request parameters for each buffer (#27699)
This commit is contained in:
		@@ -299,12 +299,12 @@ function M.refresh(opts)
 | 
			
		||||
  local bufnr = opts.bufnr and resolve_bufnr(opts.bufnr)
 | 
			
		||||
  local buffers = bufnr and { bufnr }
 | 
			
		||||
    or vim.tbl_filter(api.nvim_buf_is_loaded, api.nvim_list_bufs())
 | 
			
		||||
  local params = {
 | 
			
		||||
    textDocument = util.make_text_document_params(),
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for _, buf in ipairs(buffers) do
 | 
			
		||||
    if not active_refreshes[buf] then
 | 
			
		||||
      local params = {
 | 
			
		||||
        textDocument = util.make_text_document_params(buf),
 | 
			
		||||
      }
 | 
			
		||||
      active_refreshes[buf] = true
 | 
			
		||||
      vim.lsp.buf_request(buf, ms.textDocument_codeLens, params, M.on_codelens)
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -3879,6 +3879,92 @@ describe('LSP', function()
 | 
			
		||||
        end,
 | 
			
		||||
      }
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('refresh multiple buffers', function()
 | 
			
		||||
      local lens_title_per_fake_uri = {
 | 
			
		||||
        ['file:///fake/uri1'] = 'Lens1',
 | 
			
		||||
        ['file:///fake/uri2'] = 'Lens2',
 | 
			
		||||
      }
 | 
			
		||||
      clear()
 | 
			
		||||
      exec_lua(create_server_definition)
 | 
			
		||||
 | 
			
		||||
      -- setup lsp
 | 
			
		||||
      exec_lua(
 | 
			
		||||
        [[
 | 
			
		||||
          local lens_title_per_fake_uri = ...
 | 
			
		||||
          local server = _create_server({
 | 
			
		||||
            capabilities = {
 | 
			
		||||
              codeLensProvider = {
 | 
			
		||||
                resolveProvider = true
 | 
			
		||||
              },
 | 
			
		||||
            },
 | 
			
		||||
            handlers = {
 | 
			
		||||
              ["textDocument/codeLens"] = function(method, params)
 | 
			
		||||
                local lenses = {
 | 
			
		||||
                  {
 | 
			
		||||
                    range = {
 | 
			
		||||
                      start = { line = 0, character = 0 },
 | 
			
		||||
                      ['end'] = { line = 0, character = 0 },
 | 
			
		||||
                    },
 | 
			
		||||
                    command = {
 | 
			
		||||
                      title = lens_title_per_fake_uri[params.textDocument.uri],
 | 
			
		||||
                      command = 'Dummy',
 | 
			
		||||
                    },
 | 
			
		||||
                  },
 | 
			
		||||
                }
 | 
			
		||||
                return lenses
 | 
			
		||||
              end,
 | 
			
		||||
            }
 | 
			
		||||
          })
 | 
			
		||||
 | 
			
		||||
          CLIENT_ID = vim.lsp.start({
 | 
			
		||||
            name = "dummy",
 | 
			
		||||
            cmd = server.cmd,
 | 
			
		||||
          })
 | 
			
		||||
        ]],
 | 
			
		||||
        lens_title_per_fake_uri
 | 
			
		||||
      )
 | 
			
		||||
 | 
			
		||||
      -- create buffers and setup handler
 | 
			
		||||
      exec_lua(
 | 
			
		||||
        [[
 | 
			
		||||
          local lens_title_per_fake_uri = ...
 | 
			
		||||
          local default_buf = vim.api.nvim_get_current_buf()
 | 
			
		||||
          for fake_uri, _ in pairs(lens_title_per_fake_uri) do
 | 
			
		||||
            local bufnr = vim.uri_to_bufnr(fake_uri)
 | 
			
		||||
            vim.api.nvim_set_current_buf(bufnr)
 | 
			
		||||
            vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, {'Some contents'})
 | 
			
		||||
            vim.lsp.buf_attach_client(bufnr, CLIENT_ID)
 | 
			
		||||
          end
 | 
			
		||||
          vim.api.nvim_buf_delete(default_buf, {force = true})
 | 
			
		||||
 | 
			
		||||
          REQUEST_COUNT = vim.tbl_count(lens_title_per_fake_uri)
 | 
			
		||||
          RESPONSES = {}
 | 
			
		||||
          local on_codelens = vim.lsp.codelens.on_codelens
 | 
			
		||||
          vim.lsp.codelens.on_codelens = function (err, result, ctx, ...)
 | 
			
		||||
            table.insert(RESPONSES, { err = err, result = result, ctx = ctx })
 | 
			
		||||
            return on_codelens(err, result, ctx, ...)
 | 
			
		||||
          end
 | 
			
		||||
        ]],
 | 
			
		||||
        lens_title_per_fake_uri
 | 
			
		||||
      )
 | 
			
		||||
 | 
			
		||||
      -- call codelens refresh
 | 
			
		||||
      local cmds = exec_lua([[
 | 
			
		||||
        RESPONSES = {}
 | 
			
		||||
        vim.lsp.codelens.refresh()
 | 
			
		||||
        vim.wait(100, function () return #RESPONSES >= REQUEST_COUNT end)
 | 
			
		||||
 | 
			
		||||
        local cmds = {}
 | 
			
		||||
        for _, resp in ipairs(RESPONSES) do
 | 
			
		||||
          local uri = resp.ctx.params.textDocument.uri
 | 
			
		||||
          cmds[uri] = resp.result[1].command
 | 
			
		||||
        end
 | 
			
		||||
        return cmds
 | 
			
		||||
      ]])
 | 
			
		||||
      eq({ command = 'Dummy', title = 'Lens1' }, cmds['file:///fake/uri1'])
 | 
			
		||||
      eq({ command = 'Dummy', title = 'Lens2' }, cmds['file:///fake/uri2'])
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('vim.lsp.buf.format', function()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user