0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.2975: Vim9: can only use an autoload function name as a string

Problem:    Vim9: can only use an autoload function name as a string.
Solution:   Load the autoload script when encountered. (closes #8124)
This commit is contained in:
Bram Moolenaar
2021-06-11 22:05:47 +02:00
parent 4f13527598
commit f0a4069e3d
5 changed files with 43 additions and 3 deletions

View File

@@ -2921,8 +2921,9 @@ find_var_ht(char_u *name, char_u **varname)
if (ht != NULL) if (ht != NULL)
return ht; // local variable return ht; // local variable
// in Vim9 script items at the script level are script-local // In Vim9 script items at the script level are script-local, except
if (in_vim9script()) // for autoload names.
if (in_vim9script() && vim_strchr(name, AUTOLOAD_CHAR) == NULL)
{ {
ht = get_script_local_ht(); ht = get_script_local_ht();
if (ht != NULL) if (ht != NULL)

View File

@@ -1128,6 +1128,7 @@ do_source(
proftime_T wait_start; proftime_T wait_start;
#endif #endif
int trigger_source_post = FALSE; int trigger_source_post = FALSE;
int save_estack_compiling = estack_compiling;
ESTACK_CHECK_DECLARATION ESTACK_CHECK_DECLARATION
p = expand_env_save(fname); p = expand_env_save(fname);
@@ -1142,6 +1143,7 @@ do_source(
smsg(_("Cannot source a directory: \"%s\""), fname); smsg(_("Cannot source a directory: \"%s\""), fname);
goto theend; goto theend;
} }
estack_compiling = FALSE;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
// See if we loaded this script before. // See if we loaded this script before.
@@ -1508,6 +1510,7 @@ almosttheend:
theend: theend:
vim_free(fname_exp); vim_free(fname_exp);
estack_compiling = save_estack_compiling;
return retval; return retval;
} }

View File

@@ -114,6 +114,34 @@ def Test_autoload_name_mismatch()
delete(dir, 'rf') delete(dir, 'rf')
enddef enddef
def Test_autoload_names()
var dir = 'Xdir/autoload'
mkdir(dir, 'p')
var lines =<< trim END
func foobar#function()
return 'yes'
endfunc
let foobar#var = 'no'
END
writefile(lines, dir .. '/foobar.vim')
var save_rtp = &rtp
exe 'set rtp=' .. getcwd() .. '/Xdir'
lines =<< trim END
assert_equal('yes', foobar#function())
var Function = foobar#function
assert_equal('yes', Function())
assert_equal('no', foobar#var)
END
CheckDefAndScriptSuccess(lines)
&rtp = save_rtp
delete(dir, 'rf')
enddef
def CallRecursive(n: number): number def CallRecursive(n: number): number
return CallRecursive(n + 1) return CallRecursive(n + 1)
enddef enddef

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 */
/**/
2975,
/**/ /**/
2974, 2974,
/**/ /**/

View File

@@ -3084,7 +3084,13 @@ compile_load(
if (name == NULL) if (name == NULL)
return FAIL; return FAIL;
if (arg_exists(*arg, len, &idx, &type, &gen_load_outer, cctx) == OK) if (vim_strchr(name, AUTOLOAD_CHAR) != NULL)
{
script_autoload(name, FALSE);
res = generate_LOAD(cctx, ISN_LOADAUTO, 0, name, &t_any);
}
else if (arg_exists(*arg, len, &idx, &type, &gen_load_outer, cctx)
== OK)
{ {
if (gen_load_outer == 0) if (gen_load_outer == 0)
gen_load = TRUE; gen_load = TRUE;