0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.2735: Vim9: function reference found with prefix, not without

Problem:    Vim9: function reference found with prefix, not without.
Solution:   Also find function reference without prefix.
This commit is contained in:
Bram Moolenaar 2021-04-07 21:58:16 +02:00
parent 15e5e53ef2
commit fa5963880d
3 changed files with 43 additions and 8 deletions

View File

@ -2102,6 +2102,29 @@ def Test_expr7_funcref()
assert_equal(123, FuncRef()) assert_equal(123, FuncRef())
END END
CheckDefAndScriptSuccess(lines) CheckDefAndScriptSuccess(lines)
lines =<< trim END
vim9script
func g:GlobalFunc()
return 'global'
endfunc
func s:ScriptFunc()
return 'script'
endfunc
def Test()
var Ref = g:GlobalFunc
assert_equal('global', Ref())
Ref = GlobalFunc
assert_equal('global', Ref())
Ref = s:ScriptFunc
assert_equal('script', Ref())
Ref = ScriptFunc
assert_equal('script', Ref())
enddef
Test()
END
CheckScriptSuccess(lines)
enddef enddef
let g:test_space_dict = {'': 'empty', ' ': 'space'} let g:test_space_dict = {'': 'empty', ' ': 'space'}

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2735,
/**/ /**/
2734, 2734,
/**/ /**/

View File

@ -2889,11 +2889,11 @@ compile_load(
if (*(*arg + 1) == ':') if (*(*arg + 1) == ':')
{ {
// load namespaced variable
if (end <= *arg + 2) if (end <= *arg + 2)
{ {
isntype_T isn_type; isntype_T isn_type;
// load dictionary of namespace
switch (**arg) switch (**arg)
{ {
case 'g': isn_type = ISN_LOADGDICT; break; case 'g': isn_type = ISN_LOADGDICT; break;
@ -2912,6 +2912,7 @@ compile_load(
{ {
isntype_T isn_type = ISN_DROP; isntype_T isn_type = ISN_DROP;
// load namespaced variable
name = vim_strnsave(*arg + 2, end - (*arg + 2)); name = vim_strnsave(*arg + 2, end - (*arg + 2));
if (name == NULL) if (name == NULL)
return FAIL; return FAIL;
@ -2920,11 +2921,21 @@ compile_load(
{ {
case 'v': res = generate_LOADV(cctx, name, error); case 'v': res = generate_LOADV(cctx, name, error);
break; break;
case 's': res = compile_load_scriptvar(cctx, name, case 's': if (is_expr && ASCII_ISUPPER(*name)
&& find_func(name, FALSE, cctx) != NULL)
res = generate_funcref(cctx, name);
else
res = compile_load_scriptvar(cctx, name,
NULL, &end, error); NULL, &end, error);
break; break;
case 'g': if (vim_strchr(name, AUTOLOAD_CHAR) == NULL) case 'g': if (vim_strchr(name, AUTOLOAD_CHAR) == NULL)
isn_type = ISN_LOADG; {
if (is_expr && ASCII_ISUPPER(*name)
&& find_func(name, FALSE, cctx) != NULL)
res = generate_funcref(cctx, name);
else
isn_type = ISN_LOADG;
}
else else
{ {
isn_type = ISN_LOADAUTO; isn_type = ISN_LOADAUTO;
@ -2945,7 +2956,7 @@ compile_load(
{ {
// Global, Buffer-local, Window-local and Tabpage-local // Global, Buffer-local, Window-local and Tabpage-local
// variables can be defined later, thus we don't check if it // variables can be defined later, thus we don't check if it
// exists, give error at runtime. // exists, give an error at runtime.
res = generate_LOAD(cctx, isn_type, 0, name, &t_any); res = generate_LOAD(cctx, isn_type, 0, name, &t_any);
} }
} }
@ -2988,10 +2999,9 @@ compile_load(
res = compile_load_scriptvar(cctx, name, *arg, &end, FALSE); res = compile_load_scriptvar(cctx, name, *arg, &end, FALSE);
// When evaluating an expression and the name starts with an // When evaluating an expression and the name starts with an
// uppercase letter or "x:" it can be a user defined function. // uppercase letter it can be a user defined function.
// TODO: this is just guessing // generate_funcref() will fail if the function can't be found.
if (res == FAIL && is_expr if (res == FAIL && is_expr && ASCII_ISUPPER(*name))
&& (ASCII_ISUPPER(*name) || name[1] == ':'))
res = generate_funcref(cctx, name); res = generate_funcref(cctx, name);
} }
} }