]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.4656: Vim9: can't use item from "import autoload" with autoload dir v8.2.4656
authorBram Moolenaar <Bram@vim.org>
Thu, 31 Mar 2022 15:18:23 +0000 (16:18 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 31 Mar 2022 15:18:23 +0000 (16:18 +0100)
Problem:    Vim9: can't use items from "import autoload" with autoload
            directory name.
Solution:   Let sn_autoload_prefix overrule sn_import_autoload.
            (closes #10054)

src/structs.h
src/testdir/test_vim9_import.vim
src/version.c
src/vim9expr.c
src/vim9instr.c
src/vim9script.c

index 737b9f90e633edff9f72c0b312aced4a30d81ec9..6c92f073f40171c59e2aa625820a0a9e8edae555 100644 (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
index c6a820654a0f49142b7aae2780c9f2e03fbd9d81..2c7e731006b73ddede47ab3c28c6e3f1c52162d4 100644 (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
 
index dd1331ea9f76d46b512f07b91f71e989511dec22..ade858dc22f5324692ec25d1166ab7cb55dbc69e 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4656,
 /**/
     4655,
 /**/
index 6576fc8eabcc084cce4766246f024a3f46327af4..72bf1adbd94a1e45f3dc19e1e80347e993a870aa 100644 (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);
+       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)
index ae828cbe7dd73b9e03f432b9a05b87745deb222d..ab52d4c4c35c0456ad71d403281d76adf9285770 100644 (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)
index a63f2f7dd2d6b3a5e30ac805792a10017e46742b..cd9ff92cd66350e7b943cac8d57fe31f010a8ba0 100644 (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;