]> granicus.if.org Git - vim/commitdiff
patch 8.2.2975: Vim9: can only use an autoload function name as a string v8.2.2975
authorBram Moolenaar <Bram@vim.org>
Fri, 11 Jun 2021 20:05:47 +0000 (22:05 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 11 Jun 2021 20:05:47 +0000 (22:05 +0200)
Problem:    Vim9: can only use an autoload function name as a string.
Solution:   Load the autoload script when encountered. (closes #8124)

src/evalvars.c
src/scriptfile.c
src/testdir/test_vim9_func.vim
src/version.c
src/vim9compile.c

index 7581a14177362acb1fda7224746b3b7abdf7c06a..cd1f1702ffac77528cfda5f57a07ee256dc3a0b9 100644 (file)
@@ -2921,8 +2921,9 @@ find_var_ht(char_u *name, char_u **varname)
        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)
index bbc415664e0e2cd9ef486a9af0e015856daa4f97..eefe39a13938cbd115b622e7422335c4c617af54 100644 (file)
@@ -1128,6 +1128,7 @@ do_source(
     proftime_T             wait_start;
 #endif
     int                            trigger_source_post = FALSE;
+    int                            save_estack_compiling = estack_compiling;
     ESTACK_CHECK_DECLARATION
 
     p = expand_env_save(fname);
@@ -1142,6 +1143,7 @@ do_source(
        smsg(_("Cannot source a directory: \"%s\""), fname);
        goto theend;
     }
+    estack_compiling = FALSE;
 
 #ifdef FEAT_EVAL
     // See if we loaded this script before.
@@ -1508,6 +1510,7 @@ almosttheend:
 
 theend:
     vim_free(fname_exp);
+    estack_compiling = save_estack_compiling;
     return retval;
 }
 
index 8d891d2b1fa23e418a18c81f5b6aa561b12afa96..96e144f5dcc52fef43453b05d50966858024516e 100644 (file)
@@ -114,6 +114,34 @@ def Test_autoload_name_mismatch()
   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
index 99a635b46948f58af5647f72cc028da51d5569f4..0a113f4326eb7f68cb72628a652763c38642d617 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2975,
 /**/
     2974,
 /**/
index 6fcad3db4440cbb4101963100a30f38a9ab69b17..44c082d415addc4ceb8c705e9ea38cfde48fb0c3 100644 (file)
@@ -3084,7 +3084,13 @@ compile_load(
        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;