diff options
-rw-r--r-- | src/structs.h | 1 | ||||
-rw-r--r-- | src/testdir/test_vim9_import.vim | 25 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9expr.c | 54 | ||||
-rw-r--r-- | src/vim9instr.c | 4 | ||||
-rw-r--r-- | src/vim9script.c | 3 |
6 files changed, 64 insertions, 25 deletions
diff --git a/src/structs.h b/src/structs.h index 737b9f90e6..6c92f073f4 100644 --- a/src/structs.h +++ b/src/structs.h @@ -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 diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index c6a820654a..2c7e731006 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -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 diff --git a/src/version.c b/src/version.c index dd1331ea9f..ade858dc22 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4656, +/**/ 4655, /**/ 4654, diff --git a/src/vim9expr.c b/src/vim9expr.c index 6576fc8eab..72bf1adbd9 100644 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -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); + 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); - // 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 (res == OK) { - // "import autoload './dir/script.vim'" - load script first - res = generate_SOURCE(cctx, import->imp_sid); - 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) diff --git a/src/vim9instr.c b/src/vim9instr.c index ae828cbe7d..ab52d4c4c3 100644 --- a/src/vim9instr.c +++ b/src/vim9instr.c @@ -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) diff --git a/src/vim9script.c b/src/vim9script.c index a63f2f7dd2..cd9ff92cd6 100644 --- a/src/vim9script.c +++ b/src/vim9script.c @@ -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; |