mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.3209: Vim9: lambda doesn't find block-local variable
Problem: Vim9: lambda doesn't find block-local variable. Solution: Adjust how a script-local variable is found. (closes #8614)
This commit is contained in:
@@ -2352,6 +2352,42 @@ def Test_list_lambda()
|
|||||||
assert_match('def <lambda>\d\+(_: any): number\n1 return 0\n enddef', body)
|
assert_match('def <lambda>\d\+(_: any): number\n1 return 0\n enddef', body)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def Test_lamba_block_variable()
|
||||||
|
var lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
var flist: list<func>
|
||||||
|
for i in range(10)
|
||||||
|
var inloop = i
|
||||||
|
flist[i] = () => inloop
|
||||||
|
endfor
|
||||||
|
END
|
||||||
|
CheckScriptSuccess(lines)
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
if true
|
||||||
|
var outloop = 5
|
||||||
|
var flist: list<func>
|
||||||
|
for i in range(10)
|
||||||
|
flist[i] = () => outloop
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
END
|
||||||
|
CheckScriptSuccess(lines)
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
if true
|
||||||
|
var outloop = 5
|
||||||
|
endif
|
||||||
|
var flist: list<func>
|
||||||
|
for i in range(10)
|
||||||
|
flist[i] = () => outloop
|
||||||
|
endfor
|
||||||
|
END
|
||||||
|
CheckScriptFailure(lines, 'E1001: Variable not found: outloop', 1)
|
||||||
|
enddef
|
||||||
|
|
||||||
def Test_legacy_lambda()
|
def Test_legacy_lambda()
|
||||||
legacy echo {x -> 'hello ' .. x}('foo')
|
legacy echo {x -> 'hello ' .. x}('foo')
|
||||||
|
|
||||||
|
@@ -755,6 +755,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
3209,
|
||||||
/**/
|
/**/
|
||||||
3208,
|
3208,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -339,6 +339,7 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
|
|||||||
hashitem_T *hi;
|
hashitem_T *hi;
|
||||||
int cc;
|
int cc;
|
||||||
sallvar_T *sav;
|
sallvar_T *sav;
|
||||||
|
sallvar_T *found_sav;
|
||||||
ufunc_T *ufunc;
|
ufunc_T *ufunc;
|
||||||
|
|
||||||
// Find the list of all script variables with the right name.
|
// Find the list of all script variables with the right name.
|
||||||
@@ -361,6 +362,7 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
|
|||||||
// Go over the variables with this name and find one that was visible
|
// Go over the variables with this name and find one that was visible
|
||||||
// from the function.
|
// from the function.
|
||||||
ufunc = cctx->ctx_ufunc;
|
ufunc = cctx->ctx_ufunc;
|
||||||
|
found_sav = sav;
|
||||||
while (sav != NULL)
|
while (sav != NULL)
|
||||||
{
|
{
|
||||||
int idx;
|
int idx;
|
||||||
@@ -373,7 +375,8 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
|
|||||||
sav = sav->sav_next;
|
sav = sav->sav_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
// Not found, assume variable at script level was visible.
|
||||||
|
return found_sav;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user