diff options
author | Raphael <glephunter@gmail.com> | 2024-01-22 16:04:50 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-22 16:04:50 +0800 |
commit | 12d123959f56636473112d86ec5977ef993c58e5 (patch) | |
tree | 319deb36b20fe858b82318373dfe8171325900fc | |
parent | e68decab0352d553bd2463842d96379f56073a1c (diff) | |
download | rneovim-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.txt | 1 | ||||
-rw-r--r-- | runtime/lua/vim/_meta/vimfn.lua | 1 | ||||
-rw-r--r-- | src/nvim/eval.lua | 1 | ||||
-rw-r--r-- | src/nvim/eval/funcs.c | 4 | ||||
-rw-r--r-- | test/functional/lua/vim_spec.lua | 20 |
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) |