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:
parent
a764e73d4f
commit
3c77b6a1ce
@ -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()
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user