Skip to content

Commit 601e76a

Browse files
committed
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)
1 parent 228e629 commit 601e76a

4 files changed

Lines changed: 39 additions & 7 deletions

File tree

src/evalvars.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2461,6 +2461,20 @@ eval_variable(
24612461
tv = sv->sv_tv;
24622462
}
24632463
}
2464+
else if (in_vim9script())
2465+
{
2466+
ufunc_T *ufunc = find_func(name, FALSE, NULL);
2467+
2468+
if (ufunc != NULL)
2469+
{
2470+
foundFunc = TRUE;
2471+
if (rettv != NULL)
2472+
{
2473+
rettv->v_type = VAR_FUNC;
2474+
rettv->vval.v_string = vim_strsave(ufunc->uf_name);
2475+
}
2476+
}
2477+
}
24642478
}
24652479

24662480
if (!foundFunc)

src/testdir/test_vim9_expr.vim

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,6 +1668,17 @@ def Test_expr7_lambda_vim9script()
16681668
CheckScriptSuccess(lines)
16691669
enddef
16701670

1671+
def Test_epxr7_funcref()
1672+
let lines =<< trim END
1673+
def RetNumber(): number
1674+
return 123
1675+
enddef
1676+
let FuncRef = RetNumber
1677+
assert_equal(123, FuncRef())
1678+
END
1679+
CheckDefAndScriptSuccess(lines)
1680+
enddef
1681+
16711682
def Test_expr7_dict()
16721683
# dictionary
16731684
assert_equal(g:dict_empty, {})

src/testdir/test_vim9_script.vim

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1684,8 +1684,9 @@ def Test_vim9script_funcref()
16841684
delete('Xscript.vim')
16851685
enddef
16861686

1687-
" Check that when searcing for "FilterFunc" it doesn't find the import in the
1688-
" script where FastFilter() is called from.
1687+
" Check that when searching for "FilterFunc" it finds the import in the
1688+
" script where FastFilter() is called from, both as a string and as a direct
1689+
" function reference.
16891690
def Test_vim9script_funcref_other_script()
16901691
let filterLines =<< trim END
16911692
vim9script
@@ -1695,22 +1696,26 @@ def Test_vim9script_funcref_other_script()
16951696
export def FastFilter(): list<number>
16961697
return range(10)->filter('FilterFunc')
16971698
enddef
1699+
export def FastFilterDirect(): list<number>
1700+
return range(10)->filter(FilterFunc)
1701+
enddef
16981702
END
16991703
writefile(filterLines, 'Xfilter.vim')
17001704

17011705
let lines =<< trim END
17021706
vim9script
1703-
import {FilterFunc, FastFilter} from './Xfilter.vim'
1707+
import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
17041708
def Test()
17051709
let x: list<number> = FastFilter()
17061710
enddef
17071711
Test()
1712+
def TestDirect()
1713+
let x: list<number> = FastFilterDirect()
1714+
enddef
1715+
TestDirect()
17081716
END
1709-
writefile(lines, 'Ximport.vim')
1710-
assert_fails('source Ximport.vim', 'E121:')
1711-
1717+
CheckScriptSuccess(lines)
17121718
delete('Xfilter.vim')
1713-
delete('Ximport.vim')
17141719
enddef
17151720

17161721
def Test_vim9script_reload_delfunc()

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,8 @@ static char *(features[]) =
754754

755755
static int included_patches[] =
756756
{ /* Add new patch number below this line */
757+
/**/
758+
1527,
757759
/**/
758760
1526,
759761
/**/

0 commit comments

Comments
 (0)