# HG changeset patch # User Bram Moolenaar # Date 1617274803 -7200 # Node ID bcfff560e089f1fdee8224c817e9198e4439f720 # Parent 3c0286cbdea6ef1928543fb282236bfacc18de85 patch 8.2.2682: Vim9: cannot find Name.Func from "import * as Name" Commit: https://github.com/vim/vim/commit/529fb5a5f62378bbaac00e1ed9b9c32c6e20c1b9 Author: Bram Moolenaar Date: Thu Apr 1 12:57:57 2021 +0200 patch 8.2.2682: Vim9: cannot find Name.Func from "import * as Name" Problem: Vim9: cannot find Name.Func from "import * as Name". (Alexander Goussas) Solution: When no variable found try finding a function. (closes #8045) Check that the function was exported. diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- 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 --- 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 */ /**/ + 2682, +/**/ 2681, /**/ 2680, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -2720,11 +2720,17 @@ compile_load_scriptvar( cctx, TRUE); *p = cc; p = skipwhite(p); - - // TODO: what if it is a function? + *end = p; + if (idx < 0) + { + if (*p == '(' && ufunc != NULL) + { + generate_PUSHFUNC(cctx, ufunc->uf_name, import->imp_type); + return OK; + } return FAIL; - *end = p; + } generate_VIM9SCRIPT(cctx, ISN_LOADSCRIPT, import->imp_sid, diff --git a/src/vim9script.c b/src/vim9script.c --- 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;