Problem: Vim9: can only use an autoload function name as a string.
Solution: Load the autoload script when encountered. (closes #8124)
if (ht != NULL)
return ht; // local variable
- // in Vim9 script items at the script level are script-local
- if (in_vim9script())
+ // In Vim9 script items at the script level are script-local, except
+ // for autoload names.
+ if (in_vim9script() && vim_strchr(name, AUTOLOAD_CHAR) == NULL)
{
ht = get_script_local_ht();
if (ht != NULL)
proftime_T wait_start;
#endif
int trigger_source_post = FALSE;
+ int save_estack_compiling = estack_compiling;
ESTACK_CHECK_DECLARATION
p = expand_env_save(fname);
smsg(_("Cannot source a directory: \"%s\""), fname);
goto theend;
}
+ estack_compiling = FALSE;
#ifdef FEAT_EVAL
// See if we loaded this script before.
theend:
vim_free(fname_exp);
+ estack_compiling = save_estack_compiling;
return retval;
}
delete(dir, 'rf')
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
return CallRecursive(n + 1)
enddef
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 2975,
/**/
2974,
/**/
if (name == NULL)
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)
gen_load = TRUE;