Mercurial > vim
changeset 24283:bcfff560e089 v8.2.2682
patch 8.2.2682: Vim9: cannot find Name.Func from "import * as Name"
Commit: https://github.com/vim/vim/commit/529fb5a5f62378bbaac00e1ed9b9c32c6e20c1b9
Author: Bram Moolenaar <Bram@vim.org>
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 01 Apr 2021 13:00:03 +0200 |
parents | 3c0286cbdea6 |
children | 23d777ef9e50 |
files | src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c src/vim9script.c |
diffstat | 4 files changed, 36 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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<number> 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')
--- 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,
--- 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,
--- 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;