]> granicus.if.org Git - vim/commitdiff
patch 8.2.4176: Vim9: cannot use imported function with call() v8.2.4176
authorBram Moolenaar <Bram@vim.org>
Sat, 22 Jan 2022 11:00:02 +0000 (11:00 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 22 Jan 2022 11:00:02 +0000 (11:00 +0000)
Problem:    Vim9: cannot use imported function with call().
Solution:   Translate the function name. (closes #9590)

src/evalfunc.c
src/testdir/test_vim9_import.vim
src/version.c

index f83351254781755412e33a6356b2762f95096118..b838c395d66a4723be21c0968c083224004aca82 100644 (file)
@@ -2929,6 +2929,8 @@ f_call(typval_T *argvars, typval_T *rettv)
     char_u     *func;
     partial_T   *partial = NULL;
     dict_T     *selfdict = NULL;
+    char_u     *dot;
+    char_u     *tofree = NULL;
 
     if (in_vim9script()
            && (check_for_string_or_func_arg(argvars, 0) == FAIL
@@ -2956,6 +2958,26 @@ f_call(typval_T *argvars, typval_T *rettv)
     if (func == NULL || *func == NUL)
        return;         // type error, empty name or null function
 
+    dot = vim_strchr(func, '.');
+    if (dot != NULL)
+    {
+       imported_T *import = find_imported(func, dot - func, TRUE, NULL);
+
+       if (import != NULL && SCRIPT_ID_VALID(import->imp_sid))
+       {
+           scriptitem_T *si = SCRIPT_ITEM(import->imp_sid);
+
+           if (si->sn_autoload_prefix != NULL)
+           {
+               // Turn "import.Func" into "scriptname#Func".
+               tofree = concat_str(si->sn_autoload_prefix, dot + 1);
+               if (tofree == NULL)
+                   return;
+               func = tofree;
+           }
+       }
+    }
+
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
        if (argvars[2].v_type != VAR_DICT)
@@ -2967,6 +2989,8 @@ f_call(typval_T *argvars, typval_T *rettv)
     }
 
     (void)func_call(func, &argvars[1], partial, selfdict, rettv);
+
+    vim_free(tofree);
 }
 
 /*
index 3734709f08133e4e91872bf640e5e17c87d6ab0d..f06bea2c87758b4bb54bd44f99531557b78239c6 100644 (file)
@@ -706,7 +706,7 @@ def Test_use_autoload_import_in_fold_expression()
   edit! otherfile
   redraw
 
-  set foldexpr= foldmethod&
+  set foldexpr= foldmethod& debug=
   bwipe!
   delete('Xdir', 'rf')
   &rtp = save_rtp
@@ -1525,6 +1525,8 @@ def Test_vim9script_autoload_call()
 
       call another.Getother()
       assert_equal('other', g:result)
+
+      assert_equal('arg', call('another.RetArg', ['arg']))
   END
   CheckScriptSuccess(lines)
 
index 728f724195bea661ff666e3ea326e814fb667823..7f0dff57882b387d6dd00c491b91e1cfccd7ba22 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4176,
 /**/
     4175,
 /**/