changeset 27076:ceff6a546748 v8.2.4067

patch 8.2.4067: Vim9: cannot call imported function with :call Commit: https://github.com/vim/vim/commit/f111cdfae6edf697390e0d9a85082a6526b03da6 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jan 12 12:48:17 2022 +0000 patch 8.2.4067: Vim9: cannot call imported function with :call Problem: Vim9: cannot call imported function with :call. (Drew Vogel) Solution: Translate the function name. (closes https://github.com/vim/vim/issues/9510)
author Bram Moolenaar <Bram@vim.org>
date Wed, 12 Jan 2022 14:00:06 +0100
parents 02bf1cf035da
children 14f39b11af55
files src/testdir/test_vim9_import.vim src/userfunc.c src/version.c
diffstat 3 files changed, 55 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_import.vim
+++ b/src/testdir/test_vim9_import.vim
@@ -1185,6 +1185,35 @@ def Test_vim9script_autoload()
   END
   CheckScriptSuccess(lines)
 
+  unlet g:prefixed_loaded
+  unlet g:expected_loaded
+  delete('Xdir', 'rf')
+  &rtp = save_rtp
+enddef
+
+def Test_vim9script_autoload_call()
+  mkdir('Xdir/autoload', 'p')
+  var save_rtp = &rtp
+  exe 'set rtp^=' .. getcwd() .. '/Xdir'
+
+  var lines =<< trim END
+     vim9script autoload
+
+     export def Getother()
+       g:result = 'other'
+     enddef
+  END
+  writefile(lines, 'Xdir/autoload/other.vim')
+
+  lines =<< trim END
+      vim9script
+      import autoload 'other.vim'
+      call other.Getother()
+      assert_equal('other', g:result)
+  END
+  CheckScriptSuccess(lines)
+
+  unlet g:result
   delete('Xdir', 'rf')
   &rtp = save_rtp
 enddef
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -3744,6 +3744,30 @@ trans_function_name(
 	if (name == lv.ll_exp_name)
 	    name = NULL;
     }
+    else if (lv.ll_sid > 0)
+    {
+	scriptitem_T	*si = SCRIPT_ITEM(lv.ll_sid);
+	int		cc = *lv.ll_name_end;
+
+	// function in another script.  Prefix <SNR>99_ or the autoload prefix.
+	*lv.ll_name_end = NUL;
+	if (si->sn_autoload_prefix != NULL)
+	{
+	    name = concat_str(si->sn_autoload_prefix, lv.ll_name);
+	}
+	else
+	{
+	    sid_buf[0] = K_SPECIAL;
+	    sid_buf[1] = KS_EXTRA;
+	    sid_buf[2] = (int)KE_SNR;
+	    vim_snprintf((char *)sid_buf + 3, sizeof(sid_buf) - 3,
+					    "%ld_", (long)current_sctx.sc_sid);
+	    name = concat_str(sid_buf, lv.ll_name);
+	}
+	*lv.ll_name_end = cc;
+	*pp = end;
+	goto theend;
+    }
     else if (!(flags & TFN_NO_DEREF))
     {
 	len = (int)(end - *pp);
--- 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 */
 /**/
+    4067,
+/**/
     4066,
 /**/
     4065,