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

patch 8.2.4656: Vim9: can't use item from "import autoload" with autoload dir

Problem:    Vim9: can't use items from "import autoload" with autoload
            directory name.
Solution:   Let sn_autoload_prefix overrule sn_import_autoload.
            (closes #10054)
This commit is contained in:
Bram Moolenaar 2022-03-31 16:18:23 +01:00
parent 1104a6d0c2
commit ccbfd4883f
6 changed files with 65 additions and 26 deletions

View File

@ -1868,6 +1868,7 @@ typedef struct
char_u *sn_autoload_prefix;
// TRUE for a script used with "import autoload './dirname/script.vim'"
// For "../autoload/script.vim" sn_autoload_prefix is also set.
int sn_import_autoload;
# ifdef FEAT_PROFILE

View File

@ -969,6 +969,31 @@ def Test_autoload_import_relative()
delete('XimportRel3.vim')
enddef
def Test_autoload_import_relative_autoload_dir()
mkdir('autoload', 'p')
var lines =<< trim END
vim9script
export def Bar()
g:called_bar = 'yes'
enddef
END
writefile(lines, 'autoload/script.vim')
lines =<< trim END
vim9script
import autoload './autoload/script.vim'
def Foo()
script.Bar()
enddef
Foo()
assert_equal('yes', g:called_bar)
END
v9.CheckScriptSuccess(lines)
unlet g:called_bar
delete('autoload', 'rf')
enddef
func Test_import_in_diffexpr()
CheckExecutable diff

View File

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

View File

@ -298,26 +298,31 @@ compile_load_scriptvar(
*p = NUL;
si = SCRIPT_ITEM(import->imp_sid);
if (si->sn_autoload_prefix != NULL
&& si->sn_state == SN_STATE_NOT_LOADED)
{
char_u *auto_name = concat_str(si->sn_autoload_prefix, exp_name);
// autoload script must be loaded later, access by the autoload
// name. If a '(' follows it must be a function. Otherwise we
// don't know, it can be "script.Func".
if (cc == '(' || paren_follows_after_expr)
res = generate_PUSHFUNC(cctx, auto_name, &t_func_any);
else
res = generate_AUTOLOAD(cctx, auto_name, &t_any);
vim_free(auto_name);
done = TRUE;
}
else if (si->sn_import_autoload && si->sn_state == SN_STATE_NOT_LOADED)
{
// "import autoload './dir/script.vim'" - load script first
if (si->sn_import_autoload && si->sn_state == SN_STATE_NOT_LOADED)
// "import autoload './dir/script.vim'" or
// "import autoload './autoload/script.vim'" - load script first
res = generate_SOURCE(cctx, import->imp_sid);
if (res == OK)
if (res == OK)
{
if (si->sn_autoload_prefix != NULL
&& si->sn_state == SN_STATE_NOT_LOADED)
{
char_u *auto_name =
concat_str(si->sn_autoload_prefix, exp_name);
// autoload script must be loaded later, access by the autoload
// name. If a '(' follows it must be a function. Otherwise we
// don't know, it can be "script.Func".
if (cc == '(' || paren_follows_after_expr)
res = generate_PUSHFUNC(cctx, auto_name, &t_func_any);
else
res = generate_AUTOLOAD(cctx, auto_name, &t_any);
vim_free(auto_name);
done = TRUE;
}
else if (si->sn_import_autoload
&& si->sn_state == SN_STATE_NOT_LOADED)
{
// If a '(' follows it must be a function. Otherwise we don't
// know, it can be "script.Func".
@ -331,14 +336,15 @@ compile_load_scriptvar(
else
res = generate_OLDSCRIPT(cctx, ISN_LOADEXPORT, exp_name,
import->imp_sid, &t_any);
done = TRUE;
}
else
{
idx = find_exported(import->imp_sid, exp_name, &ufunc, &type,
cctx, NULL, TRUE);
}
done = TRUE;
}
else
{
idx = find_exported(import->imp_sid, exp_name, &ufunc, &type,
cctx, NULL, TRUE);
}
*p = cc;
*end = p;
if (done)

View File

@ -1932,7 +1932,9 @@ generate_store_var(
isntype_T isn_type = ISN_STORES;
if (SCRIPT_ID_VALID(scriptvar_sid)
&& SCRIPT_ITEM(scriptvar_sid)->sn_import_autoload)
&& SCRIPT_ITEM(scriptvar_sid)->sn_import_autoload
&& SCRIPT_ITEM(scriptvar_sid)->sn_autoload_prefix
== NULL)
{
// "import autoload './dir/script.vim'" - load script first
if (generate_SOURCE(cctx, scriptvar_sid) == FAIL)

View File

@ -415,6 +415,9 @@ handle_import_fname(char_u *fname, int is_autoload, int *sid)
si = SCRIPT_ITEM(*sid);
si->sn_import_autoload = TRUE;
if (si->sn_autoload_prefix == NULL)
si->sn_autoload_prefix = get_autoload_prefix(si);
// with testing override: load autoload script right away
if (!override_autoload || si->sn_state != SN_STATE_NOT_LOADED)
return OK;