0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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.
This commit is contained in:
Bram Moolenaar
2021-04-01 12:57:57 +02:00
parent 12be734faf
commit 529fb5a5f6
4 changed files with 37 additions and 6 deletions

View File

@@ -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')

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2682,
/**/
2681,
/**/

View File

@@ -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,

View File

@@ -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;