diff options
Diffstat (limited to 'runtime/lua/vim')
| -rw-r--r-- | runtime/lua/vim/_editor.lua | 22 | ||||
| -rw-r--r-- | runtime/lua/vim/diagnostic.lua | 2 | ||||
| -rw-r--r-- | runtime/lua/vim/highlight.lua | 19 | ||||
| -rw-r--r-- | runtime/lua/vim/loader.lua | 22 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp.lua | 5 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/_snippet.lua | 4 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/buf.lua | 1 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/codelens.lua | 2 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/handlers.lua | 1 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/log.lua | 1 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/protocol.lua | 1 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/rpc.lua | 1 | ||||
| -rw-r--r-- | runtime/lua/vim/lsp/util.lua | 3 | ||||
| -rw-r--r-- | runtime/lua/vim/shared.lua | 93 | ||||
| -rw-r--r-- | runtime/lua/vim/treesitter/query.lua | 2 | ||||
| -rw-r--r-- | runtime/lua/vim/uri.lua | 1 | 
16 files changed, 130 insertions, 50 deletions
| diff --git a/runtime/lua/vim/_editor.lua b/runtime/lua/vim/_editor.lua index fa0980563a..c922ec93db 100644 --- a/runtime/lua/vim/_editor.lua +++ b/runtime/lua/vim/_editor.lua @@ -402,8 +402,8 @@ end  --- Input and output positions are (0,0)-indexed and indicate byte positions.  ---  ---@param bufnr integer number of buffer ----@param pos1 integer[] (line, column) tuple marking beginning of region ----@param pos2 integer[] (line, column) tuple marking end of region +---@param pos1 integer[]|string start of region as a (line, column) tuple or string accepted by |getpos()| +---@param pos2 integer[]|string end of region as a (line, column) tuple or string accepted by |getpos()|  ---@param regtype string type of selection, see |setreg()|  ---@param inclusive boolean indicating whether column of pos2 is inclusive  ---@return table region Table of the form `{linenr = {startcol,endcol}}`. @@ -414,6 +414,24 @@ function vim.region(bufnr, pos1, pos2, regtype, inclusive)      vim.fn.bufload(bufnr)    end +  if type(pos1) == 'string' then +    local pos = vim.fn.getpos(pos1) +    pos1 = { pos[2] - 1, pos[3] - 1 + pos[4] } +  end +  if type(pos2) == 'string' then +    local pos = vim.fn.getpos(pos2) +    pos2 = { pos[2] - 1, pos[3] - 1 + pos[4] } +  end + +  if pos1[1] > pos2[1] or (pos1[1] == pos2[1] and pos1[2] > pos2[2]) then +    pos1, pos2 = pos2, pos1 +  end + +  -- getpos() may return {0,0,0,0} +  if pos1[1] < 0 or pos1[2] < 0 then +    return {} +  end +    -- check that region falls within current buffer    local buf_line_count = vim.api.nvim_buf_line_count(bufnr)    pos1[1] = math.min(pos1[1], buf_line_count - 1) diff --git a/runtime/lua/vim/diagnostic.lua b/runtime/lua/vim/diagnostic.lua index 714038f8e4..d1b50304c7 100644 --- a/runtime/lua/vim/diagnostic.lua +++ b/runtime/lua/vim/diagnostic.lua @@ -744,7 +744,7 @@ function M.get_namespaces()  end  ---@class Diagnostic ----@field buffer integer +---@field bufnr integer  ---@field lnum integer 0-indexed  ---@field end_lnum nil|integer 0-indexed  ---@field col integer 0-indexed diff --git a/runtime/lua/vim/highlight.lua b/runtime/lua/vim/highlight.lua index d71a806ea8..a6cfcb730f 100644 --- a/runtime/lua/vim/highlight.lua +++ b/runtime/lua/vim/highlight.lua @@ -15,8 +15,8 @@ M.priorities = {  ---@param bufnr integer Buffer number to apply highlighting to  ---@param ns integer Namespace to add highlight to  ---@param higroup string Highlight group to use for highlighting ----@param start { [1]: integer, [2]: integer } Start position {line, col} ----@param finish { [1]: integer, [2]: integer } Finish position {line, col} +---@param start integer[]|string Start of region as a (line, column) tuple or string accepted by |getpos()| +---@param finish integer[]|string End of region as a (line, column) tuple or string accepted by |getpos()|  ---@param opts table|nil Optional parameters  --             - regtype type of range (see |setreg()|, default charwise)  --             - inclusive boolean indicating whether the range is end-inclusive (default false) @@ -27,11 +27,6 @@ function M.range(bufnr, ns, higroup, start, finish, opts)    local inclusive = opts.inclusive or false    local priority = opts.priority or M.priorities.user -  -- sanity check -  if start[2] < 0 or finish[1] < start[1] then -    return -  end -    local region = vim.region(bufnr, start, finish, regtype, inclusive)    for linenr, cols in pairs(region) do      local end_row @@ -104,18 +99,12 @@ function M.on_yank(opts)      yank_timer:close()    end -  local pos1 = vim.fn.getpos("'[") -  local pos2 = vim.fn.getpos("']") - -  pos1 = { pos1[2] - 1, pos1[3] - 1 + pos1[4] } -  pos2 = { pos2[2] - 1, pos2[3] - 1 + pos2[4] } -    M.range(      bufnr,      yank_ns,      higroup, -    pos1, -    pos2, +    "'[", +    "']",      { regtype = event.regtype, inclusive = event.inclusive, priority = M.priorities.user }    ) diff --git a/runtime/lua/vim/loader.lua b/runtime/lua/vim/loader.lua index 38b1e9fc0f..66627fe4e7 100644 --- a/runtime/lua/vim/loader.lua +++ b/runtime/lua/vim/loader.lua @@ -5,7 +5,7 @@ local loaders = package.loaders  local M = {} ----@alias CacheHash {mtime: {sec:number, nsec:number}, size:number, type: string} +---@alias CacheHash {mtime: {nsec: integer, sec: integer}, size: integer, type?: uv.aliases.fs_stat_types}  ---@alias CacheEntry {hash:CacheHash, chunk:string}  ---@class ModuleFindOpts @@ -28,12 +28,11 @@ M.enabled = false  ---@field _rtp string[]  ---@field _rtp_pure string[]  ---@field _rtp_key string +---@field _hashes? table<string, CacheHash>  local Loader = {    VERSION = 3,    ---@type table<string, table<string,ModuleInfo>>    _indexed = {}, -  ---@type table<string, CacheHash> -  _hashes = {},    ---@type table<string, string[]>    _topmods = {},    _loadfile = loadfile, @@ -44,9 +43,13 @@ local Loader = {  }  --- @param path string ---- @return uv.fs_stat.result +--- @return CacheHash  --- @private  function Loader.get_hash(path) +  if not Loader._hashes then +    return uv.fs_stat(path) --[[@as CacheHash]] +  end +    if not Loader._hashes[path] then      -- Note we must never save a stat for a non-existent path.      -- For non-existent paths fs_stat() will return nil. @@ -163,13 +166,16 @@ end  ---@return string|function  ---@private  function Loader.loader(modname) +  Loader._hashes = {}    local ret = M.find(modname)[1]    if ret then      -- Make sure to call the global loadfile so we respect any augmentations done elsewhere.      -- E.g. profiling      local chunk, err = loadfile(ret.modpath) +    Loader._hashes = nil      return chunk or error(err)    end +  Loader._hashes = nil    return '\ncache_loader: module ' .. modname .. ' not found'  end @@ -373,7 +379,9 @@ function M.reset(path)    end    -- Path could be a directory so just clear all the hashes. -  Loader._hashes = {} +  if Loader._hashes then +    Loader._hashes = {} +  end  end  --- Enables the experimental Lua module loader: @@ -441,7 +449,7 @@ function Loader.lsmod(path)        if topname then          Loader._indexed[path][topname] = { modpath = modpath, modname = topname }          Loader._topmods[topname] = Loader._topmods[topname] or {} -        if not vim.tbl_contains(Loader._topmods[topname], path) then +        if not vim.list_contains(Loader._topmods[topname], path) then            table.insert(Loader._topmods[topname], path)          end        end @@ -515,7 +523,7 @@ function M._inspect(opts)          { ms(Loader._stats[stat].time / Loader._stats[stat].total) .. '\n', 'Bold' },        })        for k, v in pairs(Loader._stats[stat]) do -        if not vim.tbl_contains({ 'time', 'total' }, k) then +        if not vim.list_contains({ 'time', 'total' }, k) then            chunks[#chunks + 1] = { '* ' .. k .. ':' .. string.rep(' ', 9 - #k) }            chunks[#chunks + 1] = { tostring(v) .. '\n', 'Number' }          end diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua index 2d39f2d45d..5c78bd7580 100644 --- a/runtime/lua/vim/lsp.lua +++ b/runtime/lua/vim/lsp.lua @@ -171,7 +171,7 @@ local function for_each_buffer_client(bufnr, fn, restrict_client_ids)    if restrict_client_ids and #restrict_client_ids > 0 then      local filtered_client_ids = {}      for client_id in pairs(client_ids) do -      if vim.tbl_contains(restrict_client_ids, client_id) then +      if vim.list_contains(restrict_client_ids, client_id) then          filtered_client_ids[client_id] = true        end      end @@ -2186,7 +2186,7 @@ function lsp.formatexpr(opts)    opts = opts or {}    local timeout_ms = opts.timeout_ms or 500 -  if vim.tbl_contains({ 'i', 'R', 'ic', 'ix' }, vim.fn.mode()) then +  if vim.list_contains({ 'i', 'R', 'ic', 'ix' }, vim.fn.mode()) then      -- `formatexpr` is also called when exceeding `textwidth` in insert mode      -- fall back to internal formatting      return 1 @@ -2384,4 +2384,3 @@ lsp.commands = setmetatable({}, {  })  return lsp --- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/lsp/_snippet.lua b/runtime/lua/vim/lsp/_snippet.lua index 797d8960d5..e7ada5415f 100644 --- a/runtime/lua/vim/lsp/_snippet.lua +++ b/runtime/lua/vim/lsp/_snippet.lua @@ -17,14 +17,14 @@ P.take_until = function(targets, specials)          table.insert(raw, '\\')          new_pos = new_pos + 1          c = string.sub(input, new_pos, new_pos) -        if not vim.tbl_contains(targets, c) and not vim.tbl_contains(specials, c) then +        if not vim.list_contains(targets, c) and not vim.list_contains(specials, c) then            table.insert(esc, '\\')          end          table.insert(raw, c)          table.insert(esc, c)          new_pos = new_pos + 1        else -        if vim.tbl_contains(targets, c) then +        if vim.list_contains(targets, c) then            break          end          table.insert(raw, c) diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua index 8bf3764f5e..3d9011656f 100644 --- a/runtime/lua/vim/lsp/buf.lua +++ b/runtime/lua/vim/lsp/buf.lua @@ -806,4 +806,3 @@ function M.execute_command(command_params)  end  return M --- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/lsp/codelens.lua b/runtime/lua/vim/lsp/codelens.lua index 81cac6a511..005a0047fa 100644 --- a/runtime/lua/vim/lsp/codelens.lua +++ b/runtime/lua/vim/lsp/codelens.lua @@ -42,7 +42,7 @@ local function execute_lens(lens, bufnr, client_id)    -- Need to use the client that returned the lens → must not use buf_request    local command_provider = client.server_capabilities.executeCommandProvider    local commands = type(command_provider) == 'table' and command_provider.commands or {} -  if not vim.tbl_contains(commands, command.command) then +  if not vim.list_contains(commands, command.command) then      vim.notify(        string.format(          'Language server does not support command `%s`. This command may require a client extension.', diff --git a/runtime/lua/vim/lsp/handlers.lua b/runtime/lua/vim/lsp/handlers.lua index d01f8e6159..71bef43bc1 100644 --- a/runtime/lua/vim/lsp/handlers.lua +++ b/runtime/lua/vim/lsp/handlers.lua @@ -644,4 +644,3 @@ for k, fn in pairs(M) do  end  return M --- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/lsp/log.lua b/runtime/lua/vim/lsp/log.lua index 51dcb7d21d..3d5bc06c3f 100644 --- a/runtime/lua/vim/lsp/log.lua +++ b/runtime/lua/vim/lsp/log.lua @@ -174,4 +174,3 @@ function log.should_log(level)  end  return log --- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/lsp/protocol.lua b/runtime/lua/vim/lsp/protocol.lua index f4489ad17d..2cb8fc7955 100644 --- a/runtime/lua/vim/lsp/protocol.lua +++ b/runtime/lua/vim/lsp/protocol.lua @@ -894,4 +894,3 @@ function protocol.resolve_capabilities(server_capabilities)  end  return protocol --- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/lsp/rpc.lua b/runtime/lua/vim/lsp/rpc.lua index 30b61d01d6..af3190c9bd 100644 --- a/runtime/lua/vim/lsp/rpc.lua +++ b/runtime/lua/vim/lsp/rpc.lua @@ -753,4 +753,3 @@ return {    client_errors = client_errors,    create_read_loop = create_read_loop,  } --- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index ebde7af16c..31af2afb0b 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -1476,7 +1476,7 @@ end  local function close_preview_window(winnr, bufnrs)    vim.schedule(function()      -- exit if we are in one of ignored buffers -    if bufnrs and vim.tbl_contains(bufnrs, api.nvim_get_current_buf()) then +    if bufnrs and vim.list_contains(bufnrs, api.nvim_get_current_buf()) then        return      end @@ -2154,4 +2154,3 @@ M._get_line_byte_from_position = get_line_byte_from_position  M.buf_versions = {}  return M --- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua index eb734fb512..f700f4a6b3 100644 --- a/runtime/lua/vim/shared.lua +++ b/runtime/lua/vim/shared.lua @@ -252,12 +252,53 @@ function vim.tbl_filter(func, t)    return rettab  end ---- Checks if a list-like (vector) table contains `value`. +--- Checks if a table contains a given value, specified either directly or via +--- a predicate that is checked for each value. +--- +--- Example: +--- <pre>lua +---  vim.tbl_contains({ 'a', { 'b', 'c' } }, function(v) +---    return vim.deep_equal(v, { 'b', 'c' }) +---  end, { predicate = true }) +---  -- true +--- </pre> +--- +---@see |vim.list_contains()| for checking values in list-like tables  ---  ---@param t table Table to check +---@param value any Value to compare or predicate function reference +---@param opts (table|nil) Keyword arguments |kwargs|: +---       - predicate: (boolean) `value` is a function reference to be checked (default false) +---@return boolean `true` if `t` contains `value` +function vim.tbl_contains(t, value, opts) +  vim.validate({ t = { t, 't' }, opts = { opts, 't', true } }) + +  local pred +  if opts and opts.predicate then +    vim.validate({ value = { value, 'c' } }) +    pred = value +  else +    pred = function(v) +      return v == value +    end +  end + +  for _, v in pairs(t) do +    if pred(v) then +      return true +    end +  end +  return false +end + +--- Checks if a list-like table (integer keys without gaps) contains `value`. +--- +---@see |vim.tbl_contains()| for checking values in general tables +--- +---@param t table Table to check (must be list-like, not validated)  ---@param value any Value to compare  ---@return boolean `true` if `t` contains `value` -function vim.tbl_contains(t, value) +function vim.list_contains(t, value)    vim.validate({ t = { t, 't' } })    for _, v in ipairs(t) do @@ -279,10 +320,10 @@ function vim.tbl_isempty(t)    return next(t) == nil  end ---- We only merge empty tables or tables that are not a list +--- We only merge empty tables or tables that are not an array (indexed by integers)  ---@private  local function can_merge(v) -  return type(v) == 'table' and (vim.tbl_isempty(v) or not vim.tbl_islist(v)) +  return type(v) == 'table' and (vim.tbl_isempty(v) or not vim.tbl_isarray(v))  end  local function tbl_extend(behavior, deep_extend, ...) @@ -513,15 +554,15 @@ function vim.spairs(t)    end  end ---- Tests if a Lua table can be treated as an array. +--- Tests if a Lua table can be treated as an array (a table indexed by integers).  ---  --- Empty table `{}` is assumed to be an array, unless it was created by  --- |vim.empty_dict()| or returned as a dict-like |API| or Vimscript result,  --- for example from |rpcrequest()| or |vim.fn|.  --- ----@param t table Table ----@return boolean `true` if array-like table, else `false` -function vim.tbl_islist(t) +---@param t table +---@return boolean `true` if array-like table, else `false`. +function vim.tbl_isarray(t)    if type(t) ~= 'table' then      return false    end @@ -529,7 +570,8 @@ function vim.tbl_islist(t)    local count = 0    for k, _ in pairs(t) do -    if type(k) == 'number' then +    --- Check if the number k is an integer +    if type(k) == 'number' and k == math.floor(k) then        count = count + 1      else        return false @@ -548,6 +590,38 @@ function vim.tbl_islist(t)    end  end +--- Tests if a Lua table can be treated as a list (a table indexed by consecutive integers starting from 1). +--- +--- Empty table `{}` is assumed to be an list, unless it was created by +--- |vim.empty_dict()| or returned as a dict-like |API| or Vimscript result, +--- for example from |rpcrequest()| or |vim.fn|. +--- +---@param t table +---@return boolean `true` if list-like table, else `false`. +function vim.tbl_islist(t) +  if type(t) ~= 'table' then +    return false +  end + +  local num_elem = vim.tbl_count(t) + +  if num_elem == 0 then +    -- TODO(bfredl): in the future, we will always be inside nvim +    -- then this check can be deleted. +    if vim._empty_dict_mt == nil then +      return nil +    end +    return getmetatable(t) ~= vim._empty_dict_mt +  else +    for i = 1, num_elem do +      if t[i] == nil then +        return false +      end +    end +    return true +  end +end +  --- Counts the number of non-nil values in table `t`.  ---  --- <pre>lua @@ -811,4 +885,3 @@ function vim.defaulttable(create)  end  return vim --- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua index 5b87e6ac31..8a747ba14c 100644 --- a/runtime/lua/vim/treesitter/query.lua +++ b/runtime/lua/vim/treesitter/query.lua @@ -458,7 +458,7 @@ local directive_handlers = {        metadata[id] = {}      end -    local pattern, replacement = pred[3], pred[3] +    local pattern, replacement = pred[3], pred[4]      assert(type(pattern) == 'string')      assert(type(replacement) == 'string') diff --git a/runtime/lua/vim/uri.lua b/runtime/lua/vim/uri.lua index 38759fcdc0..08ed829114 100644 --- a/runtime/lua/vim/uri.lua +++ b/runtime/lua/vim/uri.lua @@ -134,4 +134,3 @@ return {    uri_to_fname = uri_to_fname,    uri_to_bufnr = uri_to_bufnr,  } --- vim:sw=2 ts=2 et | 
