To: vim_dev@googlegroups.com Subject: Patch 8.2.4656 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4656 Problem: Vim9: can't use items from "import autoload" with autoload directory name. Solution: Let sn_autoload_prefix overrule sn_import_autoload. (closes #10054) Files: src/structs.h, src/vim9instr.c, src/vim9expr.c, src/vim9script.c, src/testdir/test_vim9_import.vim *** ../vim-8.2.4655/src/structs.h 2022-03-30 21:12:16.447923057 +0100 --- src/structs.h 2022-03-31 15:27:03.989702184 +0100 *************** *** 1868,1873 **** --- 1868,1874 ---- 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 *** ../vim-8.2.4655/src/vim9instr.c 2022-03-30 21:12:16.451923056 +0100 --- src/vim9instr.c 2022-03-31 15:30:31.893378056 +0100 *************** *** 1932,1938 **** isntype_T isn_type = ISN_STORES; if (SCRIPT_ID_VALID(scriptvar_sid) ! && SCRIPT_ITEM(scriptvar_sid)->sn_import_autoload) { // "import autoload './dir/script.vim'" - load script first if (generate_SOURCE(cctx, scriptvar_sid) == FAIL) --- 1932,1940 ---- isntype_T isn_type = ISN_STORES; if (SCRIPT_ID_VALID(scriptvar_sid) ! && 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) *** ../vim-8.2.4655/src/vim9expr.c 2022-03-30 21:12:16.451923056 +0100 --- src/vim9expr.c 2022-03-31 16:11:01.971933148 +0100 *************** *** 298,323 **** *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 ! res = generate_SOURCE(cctx, import->imp_sid); ! if (res == OK) { // If a '(' follows it must be a function. Otherwise we don't // know, it can be "script.Func". --- 298,328 ---- *p = NUL; si = SCRIPT_ITEM(import->imp_sid); ! 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 (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,344 **** 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); } *p = cc; *end = p; if (done) --- 336,350 ---- 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); } } + *p = cc; *end = p; if (done) *** ../vim-8.2.4655/src/vim9script.c 2022-03-31 11:51:18.047324194 +0100 --- src/vim9script.c 2022-03-31 15:44:04.073397137 +0100 *************** *** 415,420 **** --- 415,423 ---- 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; *** ../vim-8.2.4655/src/testdir/test_vim9_import.vim 2022-03-31 11:37:54.263367943 +0100 --- src/testdir/test_vim9_import.vim 2022-03-31 16:02:38.860489574 +0100 *************** *** 969,974 **** --- 969,999 ---- 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 *** ../vim-8.2.4655/src/version.c 2022-03-31 12:33:56.485701120 +0100 --- src/version.c 2022-03-31 15:58:41.916788975 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4656, /**/ -- Save the plankton - eat a whale. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///