# HG changeset patch # User Bram Moolenaar # Date 1598557504 -7200 # Node ID 3991a6df522e249ed00ddc574534b2fa8d4adc18 # Parent afe0b89192195bbed5a0beca5cae8741374327b6 patch 8.2.1527: Vim9: cannot use a function name at script level Commit: https://github.com/vim/vim/commit/601e76ac3c8fa5d65ac04647a762792ea343ebd5 Author: Bram Moolenaar Date: Thu Aug 27 21:33:10 2020 +0200 patch 8.2.1527: Vim9: cannot use a function name at script level Problem: Vim9: cannot use a function name as a function reference at script level. Solution: Check if a name is a function name. (closes #6789) diff --git a/src/evalvars.c b/src/evalvars.c --- a/src/evalvars.c +++ b/src/evalvars.c @@ -2461,6 +2461,20 @@ eval_variable( tv = sv->sv_tv; } } + else if (in_vim9script()) + { + ufunc_T *ufunc = find_func(name, FALSE, NULL); + + if (ufunc != NULL) + { + foundFunc = TRUE; + if (rettv != NULL) + { + rettv->v_type = VAR_FUNC; + rettv->vval.v_string = vim_strsave(ufunc->uf_name); + } + } + } } if (!foundFunc) diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1668,6 +1668,17 @@ def Test_expr7_lambda_vim9script() CheckScriptSuccess(lines) enddef +def Test_epxr7_funcref() + let lines =<< trim END + def RetNumber(): number + return 123 + enddef + let FuncRef = RetNumber + assert_equal(123, FuncRef()) + END + CheckDefAndScriptSuccess(lines) +enddef + def Test_expr7_dict() # dictionary assert_equal(g:dict_empty, {}) 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 @@ -1684,8 +1684,9 @@ def Test_vim9script_funcref() delete('Xscript.vim') enddef -" Check that when searcing for "FilterFunc" it doesn't find the import in the -" script where FastFilter() is called from. +" Check that when searching for "FilterFunc" it finds the import in the +" script where FastFilter() is called from, both as a string and as a direct +" function reference. def Test_vim9script_funcref_other_script() let filterLines =<< trim END vim9script @@ -1695,22 +1696,26 @@ def Test_vim9script_funcref_other_script export def FastFilter(): list return range(10)->filter('FilterFunc') enddef + export def FastFilterDirect(): list + return range(10)->filter(FilterFunc) + enddef END writefile(filterLines, 'Xfilter.vim') let lines =<< trim END vim9script - import {FilterFunc, FastFilter} from './Xfilter.vim' + import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' def Test() let x: list = FastFilter() enddef Test() + def TestDirect() + let x: list = FastFilterDirect() + enddef + TestDirect() END - writefile(lines, 'Ximport.vim') - assert_fails('source Ximport.vim', 'E121:') - + CheckScriptSuccess(lines) delete('Xfilter.vim') - delete('Ximport.vim') enddef def Test_vim9script_reload_delfunc() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1527, +/**/ 1526, /**/ 1525,