aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael <glephunter@gmail.com>2024-01-22 16:04:50 +0800
committerGitHub <noreply@github.com>2024-01-22 16:04:50 +0800
commit12d123959f56636473112d86ec5977ef993c58e5 (patch)
tree319deb36b20fe858b82318373dfe8171325900fc
parente68decab0352d553bd2463842d96379f56073a1c (diff)
downloadrneovim-12d123959f56636473112d86ec5977ef993c58e5.tar.gz
rneovim-12d123959f56636473112d86ec5977ef993c58e5.tar.bz2
rneovim-12d123959f56636473112d86ec5977ef993c58e5.zip
fix(eval): properly support checking v:lua function in exists() (#27124)
-rw-r--r--runtime/doc/builtin.txt1
-rw-r--r--runtime/lua/vim/_meta/vimfn.lua1
-rw-r--r--src/nvim/eval.lua1
-rw-r--r--src/nvim/eval/funcs.c4
-rw-r--r--test/functional/lua/vim_spec.lua20
5 files changed, 14 insertions, 13 deletions
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index 775d49d2f2..9750031efd 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -1369,6 +1369,7 @@ exists({expr}) *exists()*
echo exists("*strftime")
echo exists("*s:MyFunc")
echo exists("*MyFunc")
+ echo exists("*v:lua.Func")
echo exists("bufcount")
echo exists(":Make")
echo exists("#CursorHold")
diff --git a/runtime/lua/vim/_meta/vimfn.lua b/runtime/lua/vim/_meta/vimfn.lua
index 50f6e4da52..011bfb7c11 100644
--- a/runtime/lua/vim/_meta/vimfn.lua
+++ b/runtime/lua/vim/_meta/vimfn.lua
@@ -1709,6 +1709,7 @@ function vim.fn.exepath(expr) end
--- echo exists("*strftime")
--- echo exists("*s:MyFunc")
--- echo exists("*MyFunc")
+--- echo exists("*v:lua.Func")
--- echo exists("bufcount")
--- echo exists(":Make")
--- echo exists("#CursorHold")
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua
index a820f11a5e..37fded85cd 100644
--- a/src/nvim/eval.lua
+++ b/src/nvim/eval.lua
@@ -2202,6 +2202,7 @@ M.funcs = {
echo exists("*strftime")
echo exists("*s:MyFunc")
echo exists("*MyFunc")
+ echo exists("*v:lua.Func")
echo exists("bufcount")
echo exists(":Make")
echo exists("#CursorHold")
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index 26e4e24124..d5d16fb1ef 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -1726,7 +1726,7 @@ static void f_exists(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
n = false; // Trailing garbage.
}
} else if (*p == '*') { // Internal or user defined function.
- n = function_exists(p + 1, false);
+ n = strncmp(p, "*v:lua.", 7) == 0 ? nlua_func_exists(p + 7) : function_exists(p + 1, false);
} else if (*p == ':') {
n = cmd_exists(p + 1);
} else if (*p == '#') {
@@ -1735,8 +1735,6 @@ static void f_exists(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
} else {
n = au_exists(p + 1);
}
- } else if (strncmp(p, "v:lua.", 6) == 0 && nlua_func_exists(p + 6)) {
- n = true;
} else { // Internal variable.
n = var_exists(p);
}
diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua
index 6e05728b0c..10a2437ba2 100644
--- a/test/functional/lua/vim_spec.lua
+++ b/test/functional/lua/vim_spec.lua
@@ -4055,18 +4055,18 @@ describe('Vimscript function exists()', function()
1,
exec_lua [[
_G.test = function() print("hello") end
- return vim.fn.exists('v:lua.test')
+ return vim.fn.exists('*v:lua.test')
]]
)
- eq(1, fn.exists('v:lua.require("mpack").decode'))
- eq(1, fn.exists("v:lua.require('mpack').decode"))
- eq(1, fn.exists('v:lua.require"mpack".decode'))
- eq(1, fn.exists("v:lua.require'mpack'.decode"))
- eq(1, fn.exists("v:lua.require('vim.lsp').start"))
- eq(1, fn.exists('v:lua.require"vim.lsp".start'))
- eq(1, fn.exists("v:lua.require'vim.lsp'.start"))
- eq(0, fn.exists("v:lua.require'vim.lsp'.unknown"))
- eq(0, fn.exists('v:lua.?'))
+ eq(1, fn.exists('*v:lua.require("mpack").decode'))
+ eq(1, fn.exists("*v:lua.require('mpack').decode"))
+ eq(1, fn.exists('*v:lua.require"mpack".decode'))
+ eq(1, fn.exists("*v:lua.require'mpack'.decode"))
+ eq(1, fn.exists("*v:lua.require('vim.lsp').start"))
+ eq(1, fn.exists('*v:lua.require"vim.lsp".start'))
+ eq(1, fn.exists("*v:lua.require'vim.lsp'.start"))
+ eq(0, fn.exists("*v:lua.require'vim.lsp'.unknown"))
+ eq(0, fn.exists('*v:lua.?'))
end)
end)