diff options
Diffstat (limited to 'runtime/lua/vim/lsp')
| -rw-r--r-- | runtime/lua/vim/lsp/diagnostic.lua | 42 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/log.lua | 81 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/util.lua | 2 | 
3 files changed, 74 insertions, 51 deletions
| diff --git a/runtime/lua/vim/lsp/diagnostic.lua b/runtime/lua/vim/lsp/diagnostic.lua index 6a8d6dcad7..28a236cc7e 100644 --- a/runtime/lua/vim/lsp/diagnostic.lua +++ b/runtime/lua/vim/lsp/diagnostic.lua @@ -251,7 +251,7 @@ end  ---@param client_id number  ---@private  function M.save(diagnostics, bufnr, client_id) -  vim.notify_once('vim.lsp.diagnostic.save is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.save', 'vim.diagnostic.set', '0.8' )    local namespace = M.get_namespace(client_id)    vim.diagnostic.set(namespace, bufnr, diagnostic_lsp_to_vim(diagnostics, bufnr, client_id))  end @@ -265,7 +265,7 @@ end  ---                        If nil, diagnostics of all clients are included.  ---@return table with diagnostics grouped by bufnr (bufnr: Diagnostic[])  function M.get_all(client_id) -  vim.notify_once('vim.lsp.diagnostic.get_all is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.get_all', 'vim.diagnostic.get', '0.8' )    local result = {}    local namespace    if client_id then @@ -287,7 +287,7 @@ end  ---                            Else, return just the diagnostics associated with the client_id.  ---@param predicate function|nil Optional function for filtering diagnostics  function M.get(bufnr, client_id, predicate) -  vim.notify_once('vim.lsp.diagnostic.get is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.get', 'vim.diagnostic.get', '0.8' )    predicate = predicate or function() return true end    if client_id == nil then      local all_diagnostics = {} @@ -349,7 +349,7 @@ end  ---@param severity DiagnosticSeverity  ---@param client_id number the client id  function M.get_count(bufnr, severity, client_id) -  vim.notify_once('vim.lsp.diagnostic.get_count is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.get_count', 'vim.diagnostic.get', '0.8' )    severity = severity_lsp_to_vim(severity)    local opts = { severity = severity }    if client_id ~= nil then @@ -366,7 +366,7 @@ end  ---@param opts table See |vim.lsp.diagnostic.goto_next()|  ---@return table Previous diagnostic  function M.get_prev(opts) -  vim.notify_once('vim.lsp.diagnostic.get_prev is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.get_prev', 'vim.diagnostic.get_prev', '0.8' )    if opts then      if opts.severity then        opts.severity = severity_lsp_to_vim(opts.severity) @@ -384,7 +384,7 @@ end  ---@param opts table See |vim.lsp.diagnostic.goto_next()|  ---@return table Previous diagnostic position  function M.get_prev_pos(opts) -  vim.notify_once('vim.lsp.diagnostic.get_prev_pos is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.get_prev_pos', 'vim.diagnostic.get_prev_pos', '0.8' )    if opts then      if opts.severity then        opts.severity = severity_lsp_to_vim(opts.severity) @@ -401,7 +401,7 @@ end  ---  ---@param opts table See |vim.lsp.diagnostic.goto_next()|  function M.goto_prev(opts) -  vim.notify_once('vim.lsp.diagnostic.goto_prev is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.goto_prev', 'vim.diagnostic.goto_prev', '0.8' )    if opts then      if opts.severity then        opts.severity = severity_lsp_to_vim(opts.severity) @@ -419,7 +419,7 @@ end  ---@param opts table See |vim.lsp.diagnostic.goto_next()|  ---@return table Next diagnostic  function M.get_next(opts) -  vim.notify_once('vim.lsp.diagnostic.get_next is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.get_next', 'vim.diagnostic.get_next', '0.8' )    if opts then      if opts.severity then        opts.severity = severity_lsp_to_vim(opts.severity) @@ -437,7 +437,7 @@ end  ---@param opts table See |vim.lsp.diagnostic.goto_next()|  ---@return table Next diagnostic position  function M.get_next_pos(opts) -  vim.notify_once('vim.lsp.diagnostic.get_next_pos is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.get_next_pos', 'vim.diagnostic.get_next_pos', '0.8' )    if opts then      if opts.severity then        opts.severity = severity_lsp_to_vim(opts.severity) @@ -452,7 +452,7 @@ end  ---  ---@deprecated Prefer |vim.diagnostic.goto_next()|  function M.goto_next(opts) -  vim.notify_once('vim.lsp.diagnostic.goto_next is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.goto_next', 'vim.diagnostic.goto_next', '0.8' )    if opts then      if opts.severity then        opts.severity = severity_lsp_to_vim(opts.severity) @@ -476,7 +476,7 @@ end  ---             - severity_limit (DiagnosticSeverity):  ---                 - Limit severity of diagnostics found. E.g. "Warning" means { "Error", "Warning" } will be valid.  function M.set_signs(diagnostics, bufnr, client_id, _, opts) -  vim.notify_once('vim.lsp.diagnostic.set_signs is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.set_signs', nil , '0.8' )    local namespace = M.get_namespace(client_id)    if opts and not opts.severity and opts.severity_limit then      opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} @@ -497,7 +497,7 @@ end  ---             - severity_limit (DiagnosticSeverity):  ---                 - Limit severity of diagnostics found. E.g. "Warning" means { "Error", "Warning" } will be valid.  function M.set_underline(diagnostics, bufnr, client_id, _, opts) -  vim.notify_once('vim.lsp.diagnostic.set_underline is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.set_underline', nil , '0.8' )    local namespace = M.get_namespace(client_id)    if opts and not opts.severity and opts.severity_limit then      opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} @@ -519,7 +519,7 @@ end  ---             - severity_limit (DiagnosticSeverity):  ---                 - Limit severity of diagnostics found. E.g. "Warning" means { "Error", "Warning" } will be valid.  function M.set_virtual_text(diagnostics, bufnr, client_id, _, opts) -  vim.notify_once('vim.lsp.diagnostic.set_virtual_text is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.set_virtual_text', nil , '0.8' )    local namespace = M.get_namespace(client_id)    if opts and not opts.severity and opts.severity_limit then      opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} @@ -538,7 +538,7 @@ end  ---@return an array of [text, hl_group] arrays. This can be passed directly to  ---        the {virt_text} option of |nvim_buf_set_extmark()|.  function M.get_virtual_text_chunks_for_line(bufnr, _, line_diags, opts) -  vim.notify_once('vim.lsp.diagnostic.get_virtual_text_chunks_for_line is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.get_virtual_text_chunks_for_line', nil, '0.8' )    return vim.diagnostic._get_virt_text_chunks(diagnostic_lsp_to_vim(line_diags, bufnr), opts)  end @@ -556,7 +556,7 @@ end  ---@param position table|nil The (0,0)-indexed position  ---@return table {popup_bufnr, win_id}  function M.show_position_diagnostics(opts, buf_nr, position) -  vim.notify_once('vim.lsp.diagnostic.show_position_diagnostics is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.show_position_diagnostics', 'vim.diagnostic.open_float', '0.8' )    opts = opts or {}    opts.scope = "cursor"    opts.pos = position @@ -580,7 +580,7 @@ end  ---@param client_id number|nil the client id  ---@return table {popup_bufnr, win_id}  function M.show_line_diagnostics(opts, buf_nr, line_nr, client_id) -  vim.notify_once('vim.lsp.diagnostic.show_line_diagnostics is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.show_line_diagnostics', 'vim.diagnostic.open_float', '0.8' )    opts = opts or {}    opts.scope = "line"    opts.pos = line_nr @@ -604,7 +604,7 @@ end  ---       client. The default is to redraw diagnostics for all attached  ---       clients.  function M.redraw(bufnr, client_id) -  vim.notify_once('vim.lsp.diagnostic.redraw is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.redraw', 'vim.diagnostic.show', '0.8' )    bufnr = get_bufnr(bufnr)    if not client_id then      return vim.lsp.for_each_buffer_client(bufnr, function(client) @@ -632,7 +632,7 @@ end  ---         - {workspace}: (boolean, default true)  ---             - Set the list with workspace diagnostics  function M.set_qflist(opts) -  vim.notify_once('vim.lsp.diagnostic.set_qflist is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.set_qflist', 'vim.diagnostic.setqflist', '0.8' )    opts = opts or {}    if opts.severity then      opts.severity = severity_lsp_to_vim(opts.severity) @@ -664,7 +664,7 @@ end  ---         - {workspace}: (boolean, default false)  ---             - Set the list with workspace diagnostics  function M.set_loclist(opts) -  vim.notify_once('vim.lsp.diagnostic.set_loclist is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.set_loclist', 'vim.diagnostic.setloclist', '0.8' )    opts = opts or {}    if opts.severity then      opts.severity = severity_lsp_to_vim(opts.severity) @@ -692,7 +692,7 @@ end  -- send diagnostic information and the client will still process it. The  -- diagnostics are simply not displayed to the user.  function M.disable(bufnr, client_id) -  vim.notify_once('vim.lsp.diagnostic.disable is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.disable', 'vim.diagnostic.disable', '0.8' )    if not client_id then      return vim.lsp.for_each_buffer_client(bufnr, function(client)        M.disable(bufnr, client.id) @@ -713,7 +713,7 @@ end  ---       client. The default is to enable diagnostics for all attached  ---       clients.  function M.enable(bufnr, client_id) -  vim.notify_once('vim.lsp.diagnostic.enable is deprecated. See :h deprecated', vim.log.levels.WARN) +  vim.deprecate('vim.lsp.diagnostic.enable', 'vim.diagnostic.enable', '0.8' )    if not client_id then      return vim.lsp.for_each_buffer_client(bufnr, function(client)        M.enable(bufnr, client.id) diff --git a/runtime/lua/vim/lsp/log.lua b/runtime/lua/vim/lsp/log.lua index e0b5653587..fff42fd011 100644 --- a/runtime/lua/vim/lsp/log.lua +++ b/runtime/lua/vim/lsp/log.lua @@ -8,7 +8,7 @@ local log = {}  -- Log level dictionary with reverse lookup as well.  --  -- Can be used to lookup the number from the name or the name from the number. --- Levels by name: "TRACE", "DEBUG", "INFO", "WARN", "ERROR" +-- Levels by name: "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF"  -- Level numbers begin with "TRACE" at 0  log.levels = vim.deepcopy(vim.log.levels) @@ -25,27 +25,47 @@ do    end    local logfilename = path_join(vim.fn.stdpath('cache'), 'lsp.log') +  -- TODO: Ideally the directory should be created in open_logfile(), right +  -- before opening the log file, but open_logfile() can be called from libuv +  -- callbacks, where using fn.mkdir() is not allowed. +  vim.fn.mkdir(vim.fn.stdpath('cache'), "p") +    --- Returns the log filename.    ---@returns (string) log filename    function log.get_filename()      return logfilename    end -  vim.fn.mkdir(vim.fn.stdpath('cache'), "p") -  local logfile = assert(io.open(logfilename, "a+")) - -  local log_info = vim.loop.fs_stat(logfilename) -  if log_info and log_info.size > 1e9 then -    local warn_msg = string.format( -      "LSP client log is large (%d MB): %s", -      log_info.size / (1000 * 1000), -      logfilename -    ) -    vim.notify(warn_msg) +  local logfile, openerr +  ---@private +  --- Opens log file. Returns true if file is open, false on error +  local function open_logfile() +    -- Try to open file only once +    if logfile then return true end +    if openerr then return false end + +    logfile, openerr = io.open(logfilename, "a+") +    if not logfile then +      local err_msg = string.format("Failed to open LSP client log file: %s", openerr) +      vim.notify(err_msg, vim.log.levels.ERROR) +      return false +    end + +    local log_info = vim.loop.fs_stat(logfilename) +    if log_info and log_info.size > 1e9 then +      local warn_msg = string.format( +        "LSP client log is large (%d MB): %s", +        log_info.size / (1000 * 1000), +        logfilename +      ) +      vim.notify(warn_msg) +    end + +    -- Start message for logging +    logfile:write(string.format("[START][%s] LSP logging initiated\n", os.date(log_date_format))) +    return true    end -  -- Start message for logging -  logfile:write(string.format("[START][%s] LSP logging initiated\n", os.date(log_date_format)))    for level, levelnr in pairs(log.levels) do      -- Also export the log level on the root object.      log[level] = levelnr @@ -63,23 +83,26 @@ do      -- ```      --      -- This way you can avoid string allocations if the log level isn't high enough. -    log[level:lower()] = function(...) -      local argc = select("#", ...) -      if levelnr < current_log_level then return false end -      if argc == 0 then return true end -      local info = debug.getinfo(2, "Sl") -      local header = string.format("[%s][%s] ...%s:%s", level, os.date(log_date_format), string.sub(info.short_src, #info.short_src - 15), info.currentline) -      local parts = { header } -      for i = 1, argc do -        local arg = select(i, ...) -        if arg == nil then -          table.insert(parts, "nil") -        else -          table.insert(parts, format_func(arg)) +    if level ~= "OFF" then +      log[level:lower()] = function(...) +        local argc = select("#", ...) +        if levelnr < current_log_level then return false end +        if argc == 0 then return true end +        if not open_logfile() then return false end +        local info = debug.getinfo(2, "Sl") +        local header = string.format("[%s][%s] ...%s:%s", level, os.date(log_date_format), string.sub(info.short_src, #info.short_src - 15), info.currentline) +        local parts = { header } +        for i = 1, argc do +          local arg = select(i, ...) +          if arg == nil then +            table.insert(parts, "nil") +          else +            table.insert(parts, format_func(arg)) +          end          end +        logfile:write(table.concat(parts, '\t'), "\n") +        logfile:flush()        end -      logfile:write(table.concat(parts, '\t'), "\n") -      logfile:flush()      end    end  end diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index 77ab1d4224..72dfb3cd76 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -456,7 +456,7 @@ function M.apply_text_edits(text_edits, bufnr, offset_encoding)    -- Remove final line if needed    local fix_eol = has_eol_text_edit -  fix_eol = fix_eol and (api.nvim_buf_get_option(bufnr, 'eol') or (api.nvim_buf_get_option(bufnr, 'fixeol') and not api.nvim_buf_get_option('binary'))) +  fix_eol = fix_eol and (api.nvim_buf_get_option(bufnr, 'eol') or (api.nvim_buf_get_option(bufnr, 'fixeol') and not api.nvim_buf_get_option(bufnr, 'binary')))    fix_eol = fix_eol and get_line(bufnr, max - 1) == ''    if fix_eol then      vim.api.nvim_buf_set_lines(bufnr, -2, -1, false, {}) | 
