diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index cd8ac091d6..0d49a42d9f 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -1623,6 +1623,10 @@ def Test_vim9script_funcref() export def FastSort(): list return range(5)->sort(Compare) enddef + + export def GetString(arg: string): string + return arg + enddef END writefile(sortlines, 'Xsort.vim') @@ -1633,6 +1637,19 @@ def Test_vim9script_funcref() g:result = FastSort() enddef Test() + + # using a function imported with "as" + import * as anAlias from './Xsort.vim' + assert_equal('yes', anAlias.GetString('yes')) + + # using the function from a compiled function + def TestMore(): string + return anAlias.GetString('text') + enddef + assert_equal('text', TestMore()) + + # error when using a function that isn't exported + assert_fails('anAlias.Compare(1, 2)', 'E1049:') END writefile(lines, 'Xscript.vim') diff --git a/src/version.c b/src/version.c index 104073d316..54370d3eb2 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2682, /**/ 2681, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 72387610df..fa73de23da 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -2720,12 +2720,18 @@ compile_load_scriptvar( cctx, TRUE); *p = cc; p = skipwhite(p); - - // TODO: what if it is a function? - if (idx < 0) - return FAIL; *end = p; + if (idx < 0) + { + if (*p == '(' && ufunc != NULL) + { + generate_PUSHFUNC(cctx, ufunc->uf_name, import->imp_type); + return OK; + } + return FAIL; + } + generate_VIM9SCRIPT(cctx, ISN_LOADSCRIPT, import->imp_sid, idx, diff --git a/src/vim9script.c b/src/vim9script.c index 9839a06cfb..a72ef55095 100644 --- a/src/vim9script.c +++ b/src/vim9script.c @@ -298,8 +298,7 @@ find_exported( svar_T *sv; scriptitem_T *script = SCRIPT_ITEM(sid); - // find name in "script" - // TODO: also find script-local user function + // Find name in "script". idx = get_script_item_idx(sid, name, 0, cctx); if (idx >= 0) { @@ -341,6 +340,13 @@ find_exported( semsg(_(e_item_not_found_in_script_str), name); return -1; } + else if (((*ufunc)->uf_flags & FC_EXPORT) == 0) + { + if (verbose) + semsg(_(e_item_not_exported_in_script_str), name); + *ufunc = NULL; + return -1; + } } return idx;