From fe4583127f0aaf631b05ad3dff7ebb0126314cf2 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 16 Apr 2024 07:31:43 -0700 Subject: fix: vim.validate() order is not deterministic #28377 Problem: The order of the validation performed by vim.validate() is unpredictable. - harder to write reliable tests. - confusing UX because validation result might return different errors randomly. Solution: Iterate the input using `vim.spairs()`. Future: Ideally, the caller could provide an "ordered dict". --- runtime/lua/vim/shared.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'runtime/lua/vim/shared.lua') diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua index a9eebf36da..eb51c244ef 100644 --- a/runtime/lua/vim/shared.lua +++ b/runtime/lua/vim/shared.lua @@ -578,7 +578,7 @@ end ---@return fun(table: table, index?: K):K, V # |for-in| iterator over sorted keys and their values ---@return T function vim.spairs(t) - vim.validate({ t = { t, 't' } }) + assert(type(t) == 'table', ('expected table, got %s'):format(type(t))) --- @cast t table -- collect the keys @@ -795,7 +795,7 @@ do return false, string.format('opt: expected table, got %s', type(opt)) end - for param_name, spec in pairs(opt) do + for param_name, spec in vim.spairs(opt) do if type(spec) ~= 'table' then return false, string.format('opt[%s]: expected table, got %s', param_name, type(spec)) end @@ -851,7 +851,8 @@ do return true end - --- Validates a parameter specification (types and values). + --- Validates a parameter specification (types and values). Specs are evaluated in alphanumeric + --- order, until the first failure. --- --- Usage example: --- -- cgit