0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.3222: Vim9: cannot used loop variable later as lambda argument

Problem:    Vim9: cannot used loop variable later as lambda argument.
Solution:   When not in function context check the current block ID.
            (closes #8637)
This commit is contained in:
Bram Moolenaar 2021-07-25 18:07:00 +02:00
parent a764e73d4f
commit 3c77b6a1ce
3 changed files with 27 additions and 3 deletions

View File

@ -2352,7 +2352,7 @@ 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() def Test_lambda_block_variable()
var lines =<< trim END var lines =<< trim END
vim9script vim9script
var flist: list<func> var flist: list<func>
@ -2386,6 +2386,15 @@ def Test_lamba_block_variable()
endfor endfor
END END
CheckScriptFailure(lines, 'E1001: Variable not found: outloop', 1) CheckScriptFailure(lines, 'E1001: Variable not found: outloop', 1)
lines =<< trim END
vim9script
for i in range(10)
var Ref = () => 0
endfor
assert_equal(0, ((i) => 0)(0))
END
CheckScriptSuccess(lines)
enddef enddef
def Test_legacy_lambda() def Test_legacy_lambda()

View File

@ -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 */
/**/
3222,
/**/ /**/
3221, 3221,
/**/ /**/

View File

@ -355,10 +355,23 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
return NULL; return NULL;
sav = HI2SAV(hi); sav = HI2SAV(hi);
if (sav->sav_block_id == 0 || cctx == NULL) if (sav->sav_block_id == 0)
// variable defined in the script scope or not in a function. // variable defined in the top script scope is always visible
return sav; return sav;
if (cctx == NULL)
{
// Not in a function scope, find variable with block id equal to or
// smaller than the current block id.
while (sav != NULL)
{
if (sav->sav_block_id <= si->sn_current_block_id)
break;
sav = sav->sav_next;
}
return sav;
}
// 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;