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 #9510)
diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim
index 7aa1549..d43012c 100644
--- a/src/testdir/test_vim9_import.vim
+++ b/src/testdir/test_vim9_import.vim
@@ -1185,6 +1185,35 @@
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
diff --git a/src/userfunc.c b/src/userfunc.c
index 4516a48..a227700 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -3744,6 +3744,30 @@
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);
diff --git a/src/version.c b/src/version.c
index 24d2f08..adf2175 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4067,
+/**/
4066,
/**/
4065,