From e628c011bfb58685e4a4ce7da681afda08989a7f Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sat, 18 May 2019 22:04:31 +0200 Subject: gen_vimdoc.py: support lua/shared.lua module [ci skip] --- runtime/lua/vim/shared.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'runtime/lua/vim/shared.lua') diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua index 9dca51ce9a..ec0c74e257 100644 --- a/runtime/lua/vim/shared.lua +++ b/runtime/lua/vim/shared.lua @@ -16,14 +16,14 @@ local function tbl_contains(t, value) return false end ---- Merges two or more map-like tables. +-- Merges two or more map-like tables. -- --@see |extend()| -- --- behavior: Decides what to do if a key is found in more than one map: --- "error": raise an error --- "keep": use value from the leftmost map --- "force": use value from the rightmost map +--@param behavior Decides what to do if a key is found in more than one map: +--- - "error": raise an error +--- - "keep": use value from the leftmost map +--- - "force": use value from the rightmost map local function tbl_extend(behavior, ...) if (behavior ~= 'error' and behavior ~= 'keep' and behavior ~= 'force') then error('invalid "behavior": '..tostring(behavior)) -- cgit From e4c2d85c7729925128746d08883286b75fb097a8 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 19 May 2019 17:58:54 +0200 Subject: lua/shared: share deepcopy() with test/* deepcopy() was duplicated in test/helpers.lua --- runtime/lua/vim/shared.lua | 56 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 8 deletions(-) (limited to 'runtime/lua/vim/shared.lua') diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua index ec0c74e257..f5d7a51724 100644 --- a/runtime/lua/vim/shared.lua +++ b/runtime/lua/vim/shared.lua @@ -1,9 +1,43 @@ ---- Shared functions --- - Used by Nvim and tests --- - Can run in vanilla Lua (do not require a running instance of Nvim) +-- Functions shared by Nvim and its test-suite. +-- +-- The singular purpose of this module is to share code with the Nvim +-- test-suite. If, in the future, Nvim itself is used to run the test-suite +-- instead of "vanilla Lua", these functions could move to src/nvim/lua/vim.lua --- Checks if a list-like (vector) table contains `value`. +--- Returns a deep copy of the given object. Non-table objects are copied as +--- in a typical Lua assignment, whereas table objects are copied recursively. +--- +--@param orig Table to copy +--@returns New table of copied keys and (nested) values. +local function deepcopy(orig) + error() +end +local function _id(v) + return v +end +local deepcopy_funcs = { + table = function(orig) + local copy = {} + for k, v in pairs(orig) do + copy[deepcopy(k)] = deepcopy(v) + end + return copy + end, + number = _id, + string = _id, + ['nil'] = _id, + boolean = _id, +} +deepcopy = function(orig) + return deepcopy_funcs[type(orig)](orig) +end + +--- Checks if a list-like (vector) table contains `value`. +--- +--@param t Table to check +--@param value Value to compare +--@returns true if `t` contains `value` local function tbl_contains(t, value) if type(t) ~= 'table' then error('t must be a table') @@ -16,14 +50,15 @@ local function tbl_contains(t, value) return false end --- Merges two or more map-like tables. --- +--- Merges two or more map-like tables. +--- --@see |extend()| --- +--- --@param behavior Decides what to do if a key is found in more than one map: --- - "error": raise an error --- - "keep": use value from the leftmost map --- - "force": use value from the rightmost map +--@param ... Two or more map-like tables. local function tbl_extend(behavior, ...) if (behavior ~= 'error' and behavior ~= 'keep' and behavior ~= 'force') then error('invalid "behavior": '..tostring(behavior)) @@ -46,7 +81,11 @@ local function tbl_extend(behavior, ...) return ret end --- Flattens a list-like table: unrolls and appends nested tables to table `t`. +--- Creates a copy of a list-like table such that any nested tables are +--- "unrolled" and appended to the result. +--- +--@param t List-like table +--@returns Flattened copy of the given list-like table. local function tbl_flatten(t) -- From https://github.com/premake/premake-core/blob/master/src/base/table.lua local result = {} @@ -66,6 +105,7 @@ local function tbl_flatten(t) end local module = { + deepcopy = deepcopy, tbl_contains = tbl_contains, tbl_extend = tbl_extend, tbl_flatten = tbl_flatten, -- cgit From fab81cfb04b345fa7465fa099204d50a496f1819 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 19 May 2019 18:31:40 +0200 Subject: lua/shared: share more stuff Leave trim() in vim.lua, because gen_vimdoc.py needs at least one function in there, else it gets confused... --- runtime/lua/vim/shared.lua | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'runtime/lua/vim/shared.lua') diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua index f5d7a51724..07f9f52e5c 100644 --- a/runtime/lua/vim/shared.lua +++ b/runtime/lua/vim/shared.lua @@ -33,6 +33,70 @@ deepcopy = function(orig) return deepcopy_funcs[type(orig)](orig) end +--- Splits a string at each instance of a separator. +--- +--@see |vim.split()| +--@see https://www.lua.org/pil/20.2.html +--@see http://lua-users.org/wiki/StringLibraryTutorial +--- +--@param s String to split +--@param sep Separator string or pattern +--@param plain If `true` use `sep` literally (passed to String.find) +--@returns Iterator over the split components +local function gsplit(s, sep, plain) + assert(type(s) == "string") + assert(type(sep) == "string") + assert(type(plain) == "boolean" or type(plain) == "nil") + + local start = 1 + local done = false + + local function _pass(i, j, ...) + if i then + assert(j+1 > start, "Infinite loop detected") + local seg = s:sub(start, i - 1) + start = j + 1 + return seg, ... + else + done = true + return s:sub(start) + end + end + + return function() + if done then + return + end + if sep == '' then + if start == #s then + done = true + end + return _pass(start+1, start) + end + return _pass(s:find(sep, start, plain)) + end +end + +--- Splits a string at each instance of a separator. +--- +--- Examples: +---
+---  split(":aa::b:", ":")     --> {'','aa','','bb',''}
+---  split("axaby", "ab?")     --> {'','x','y'}
+---  split(x*yz*o, "*", true)  --> {'x','yz','o'}
+--- 
+-- +--@see |vim.gsplit()| +--- +--@param s String to split +--@param sep Separator string or pattern +--@param plain If `true` use `sep` literally (passed to String.find) +--@returns List-like table of the split components. +local function split(s,sep,plain) + local t={} for c in gsplit(s, sep, plain) do table.insert(t,c) end + return t +end + --- Checks if a list-like (vector) table contains `value`. --- --@param t Table to check @@ -106,6 +170,8 @@ end local module = { deepcopy = deepcopy, + gsplit = gsplit, + split = split, tbl_contains = tbl_contains, tbl_extend = tbl_extend, tbl_flatten = tbl_flatten, -- cgit