0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.4016: Vim9: incorrect error for argument that is shadowing var

Problem:    Vim9: incorrect error for argument that is shadowing var.
Solution:   Ignore variable that is not in block where the function was
            defined.
This commit is contained in:
Bram Moolenaar
2022-01-06 12:23:30 +00:00
parent 269dc63618
commit 58493cfae2
3 changed files with 19 additions and 4 deletions

View File

@@ -933,6 +933,21 @@ def Test_local_function_shadows_global()
delfunc g:Func delfunc g:Func
END END
CheckScriptSuccess(lines) CheckScriptSuccess(lines)
# This does not shadow "i" which is visible only inside the for loop
lines =<< trim END
vim9script
def Foo(i: number)
echo i
enddef
for i in range(3)
# Foo() is compiled here
Foo(i)
endfor
END
CheckScriptSuccess(lines)
enddef enddef
func TakesOneArg(arg) func TakesOneArg(arg)

View File

@@ -750,6 +750,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 */
/**/
4016,
/**/ /**/
4015, 4015,
/**/ /**/

View File

@@ -162,7 +162,6 @@ 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.
@@ -198,7 +197,6 @@ 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;
@@ -211,8 +209,8 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
sav = sav->sav_next; sav = sav->sav_next;
} }
// Not found, assume variable at script level was visible. // Not found, variable was not visible.
return found_sav; return NULL;
} }
/* /*