0
0
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:
Bram Moolenaar
2021-07-24 14:14:52 +02:00
parent 1a3e5747b7
commit 88421d6dc8
3 changed files with 42 additions and 1 deletions

View File

@@ -2352,6 +2352,42 @@ def Test_list_lambda()
assert_match('def <lambda>\d\+(_: any): number\n1 return 0\n enddef', body)
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()
legacy echo {x -> 'hello ' .. x}('foo')

View File

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

View File

@@ -339,6 +339,7 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
hashitem_T *hi;
int cc;
sallvar_T *sav;
sallvar_T *found_sav;
ufunc_T *ufunc;
// 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
// from the function.
ufunc = cctx->ctx_ufunc;
found_sav = sav;
while (sav != NULL)
{
int idx;
@@ -373,7 +375,8 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
sav = sav->sav_next;
}
return NULL;
// Not found, assume variable at script level was visible.
return found_sav;
}
/*