diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-08-27 21:33:10 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-08-27 21:33:10 +0200 |
commit | 601e76ac3c8fa5d65ac04647a762792ea343ebd5 (patch) | |
tree | 787a9de42ab520a3e339a64e6c2116552178692e | |
parent | 228e62975e7aef9d6224a5a7c43625c1c1494fc2 (diff) | |
download | vim-git-601e76ac3c8fa5d65ac04647a762792ea343ebd5.tar.gz |
patch 8.2.1527: Vim9: cannot use a function name at script levelv8.2.1527
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)
-rw-r--r-- | src/evalvars.c | 14 | ||||
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 11 | ||||
-rw-r--r-- | src/testdir/test_vim9_script.vim | 19 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 39 insertions, 7 deletions
diff --git a/src/evalvars.c b/src/evalvars.c index fbf521e71..a946c75ba 100644 --- 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 index 4ff0fd7e2..e8e766828 100644 --- 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 index 245817b99..952b67522 100644 --- 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<number> return range(10)->filter('FilterFunc') enddef + export def FastFilterDirect(): list<number> + 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<number> = FastFilter() enddef Test() + def TestDirect() + let x: list<number> = 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 index 514cc6890..0b6328187 100644 --- 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, |