commit 40351bbbbe7891db9bdeb0d6c3bd95e2e0309775
parent 0862c1036a8e45c594ed279dd4576719f93614c5
Author: Justin M. Keyes <justinkz@gmail.com>
Date: Sun, 4 May 2025 16:36:32 -0700
fix(lua): vim.validate `message` param #33675
Problem:
vim.validate does not handle `message` param.
Solution:
Add the missing logic.
Diffstat:
4 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua
@@ -475,7 +475,8 @@ lsp.config = setmetatable({ _configs = {} }, {
--- @param cfg vim.lsp.Config
__newindex = function(self, name, cfg)
validate_config_name(name)
- validate('cfg', cfg, 'table')
+ local msg = ('table (hint: to resolve a config, use vim.lsp.config["%s"])'):format(name)
+ validate('cfg', cfg, 'table', msg)
invalidate_enabled_config(name)
self._configs[name] = cfg
end,
@@ -485,7 +486,8 @@ lsp.config = setmetatable({ _configs = {} }, {
--- @param cfg vim.lsp.Config
__call = function(self, name, cfg)
validate_config_name(name)
- validate('cfg', cfg, 'table')
+ local msg = ('table (hint: to resolve a config, use vim.lsp.config["%s"])'):format(name)
+ validate('cfg', cfg, 'table', msg)
invalidate_enabled_config(name)
self[name] = vim.tbl_deep_extend('force', self._configs[name] or {}, cfg)
end,
diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua
@@ -865,7 +865,7 @@ do
--- @param param_name string
--- @param val any
--- @param validator vim.validate.Validator
- --- @param message? string
+ --- @param message? string "Expected" message
--- @param allow_alias? boolean Allow short type names: 'n', 's', 't', 'b', 'f', 'c'
--- @return string?
local function is_valid(param_name, val, validator, message, allow_alias)
@@ -877,18 +877,18 @@ do
end
if not is_type(val, expected) then
- return string.format('%s: expected %s, got %s', param_name, expected, type(val))
+ return ('%s: expected %s, got %s'):format(param_name, message or expected, type(val))
end
elseif vim.is_callable(validator) then
-- Check user-provided validation function
local valid, opt_msg = validator(val)
if not valid then
- local err_msg =
- string.format('%s: expected %s, got %s', param_name, message or '?', tostring(val))
-
- if opt_msg then
- err_msg = string.format('%s. Info: %s', err_msg, opt_msg)
- end
+ local err_msg = ('%s: expected %s, got %s'):format(
+ param_name,
+ message or '?',
+ tostring(val)
+ )
+ err_msg = opt_msg and ('%s. Info: %s'):format(err_msg, opt_msg) or err_msg
return err_msg
end
diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua
@@ -1556,11 +1556,16 @@ describe('lua stdlib', function()
pcall_err(exec_lua, "vim.validate('arg1', nil, {'number', 'string'})")
)
- -- Pass an additional message back.
+ -- Validator func can return an extra "Info" message.
matches(
'arg1: expected %?, got 3. Info: TEST_MSG',
pcall_err(exec_lua, "vim.validate('arg1', 3, function(a) return a == 1, 'TEST_MSG' end)")
)
+ -- Caller can override the "expected" message.
+ eq(
+ 'arg1: expected TEST_MSG, got nil',
+ pcall_err(exec_lua, "vim.validate('arg1', nil, 'table', 'TEST_MSG')")
+ )
end)
it('vim.validate (spec form)', function()
diff --git a/test/functional/plugin/lsp_spec.lua b/test/functional/plugin/lsp_spec.lua
@@ -6313,7 +6313,7 @@ describe('LSP', function()
end)
describe('vim.lsp.config() and vim.lsp.enable()', function()
- it('can merge settings from "*"', function()
+ it('merges settings from "*"', function()
eq(
{
name = 'foo',
@@ -6329,6 +6329,15 @@ describe('LSP', function()
)
end)
+ it('config("bogus") shows a hint', function()
+ matches(
+ 'hint%: to resolve a config',
+ pcall_err(exec_lua, function()
+ vim.print(vim.lsp.config('non-existent-config'))
+ end)
+ )
+ end)
+
it('sets up an autocmd', function()
eq(
1,
@@ -6650,21 +6659,18 @@ describe('LSP', function()
local _ = vim.lsp.config['foo*']
end)
)
-
matches(
err,
pcall_err(exec_lua, function()
vim.lsp.config['foo*'] = {}
end)
)
-
matches(
err,
pcall_err(exec_lua, function()
vim.lsp.config('foo*', {})
end)
)
-
-- Exception for '*'
pcall(exec_lua, function()
vim.lsp.config('*', {})