0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.3782: Vim9: no error if a function shadows a script variable

Problem:    Vim9: no error if a function shadows a script variable.
Solution:   Check the function doesn't shadow a variable. (closes #9310)
This commit is contained in:
Bram Moolenaar
2021-12-11 13:54:46 +00:00
parent a416861c64
commit 052ff291d7
5 changed files with 46 additions and 10 deletions

View File

@@ -2712,7 +2712,7 @@ eval_variable(
type = sv->sv_type; type = sv->sv_type;
} }
} }
else if (in_vim9script()) else if (in_vim9script() && (flags & EVAL_VAR_NO_FUNC) == 0)
{ {
ufunc_T *ufunc = find_func(name, FALSE, NULL); ufunc_T *ufunc = find_func(name, FALSE, NULL);

View File

@@ -1896,6 +1896,17 @@ def Test_script_var_shadows_function()
CheckScriptFailure(lines, 'E1041:', 5) CheckScriptFailure(lines, 'E1041:', 5)
enddef enddef
def Test_function_shadows_script_var()
var lines =<< trim END
vim9script
var Func = 1
def Func(): number
return 123
enddef
END
CheckScriptFailure(lines, 'E1041:', 3)
enddef
def Test_script_var_shadows_command() def Test_script_var_shadows_command()
var lines =<< trim END var lines =<< trim END
var undo = 1 var undo = 1
@@ -2198,7 +2209,7 @@ def Test_func_overrules_import_fails()
echo 'local to function' echo 'local to function'
enddef enddef
END END
CheckScriptFailure(lines, 'E1073:') CheckScriptFailure(lines, 'E1041:')
lines =<< trim END lines =<< trim END
vim9script vim9script
@@ -2231,7 +2242,7 @@ def Test_func_redefine_fails()
vim9script vim9script
def Foo(): string def Foo(): string
return 'foo' return 'foo'
enddef enddef
def Func() def Func()
var Foo = {-> 'lambda'} var Foo = {-> 'lambda'}
enddef enddef

View File

@@ -4134,19 +4134,41 @@ define_function(exarg_T *eap, char_u *name_arg)
|| (fudi.fd_di->di_tv.v_type != VAR_FUNC || (fudi.fd_di->di_tv.v_type != VAR_FUNC
&& fudi.fd_di->di_tv.v_type != VAR_PARTIAL))) && fudi.fd_di->di_tv.v_type != VAR_PARTIAL)))
{ {
char_u *name_base = arg;
int i;
if (*arg == K_SPECIAL) if (*arg == K_SPECIAL)
j = 3; {
else name_base = vim_strchr(arg, '_');
j = 0; if (name_base == NULL)
while (arg[j] != NUL && (j == 0 ? eval_isnamec1(arg[j]) name_base = arg + 3;
: eval_isnamec(arg[j]))) else
++j; ++name_base;
if (arg[j] != NUL) }
for (i = 0; name_base[i] != NUL && (i == 0
? eval_isnamec1(name_base[i])
: eval_isnamec(name_base[i])); ++i)
;
if (name_base[i] != NUL)
emsg_funcname((char *)e_invarg2, arg); emsg_funcname((char *)e_invarg2, arg);
// In Vim9 script a function cannot have the same name as a
// variable.
if (vim9script && *arg == K_SPECIAL
&& eval_variable(name_base, STRLEN(name_base), NULL, NULL,
EVAL_VAR_NOAUTOLOAD + EVAL_VAR_IMPORT
+ EVAL_VAR_NO_FUNC) == OK)
{
semsg(_(e_redefining_script_item_str), name_base);
goto ret_free;
}
} }
// Disallow using the g: dict. // Disallow using the g: dict.
if (fudi.fd_dict != NULL && fudi.fd_dict->dv_scope == VAR_DEF_SCOPE) if (fudi.fd_dict != NULL && fudi.fd_dict->dv_scope == VAR_DEF_SCOPE)
{
emsg(_("E862: Cannot use g: here")); emsg(_("E862: Cannot use g: here"));
goto ret_free;
}
} }
// This may get more lines and make the pointers into the first line // This may get more lines and make the pointers into the first line

View File

@@ -753,6 +753,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 */
/**/
3782,
/**/ /**/
3781, 3781,
/**/ /**/

View File

@@ -2782,6 +2782,7 @@ long elapsed(DWORD start_tick);
#define EVAL_VAR_VERBOSE 1 // may give error message #define EVAL_VAR_VERBOSE 1 // may give error message
#define EVAL_VAR_NOAUTOLOAD 2 // do not use script autoloading #define EVAL_VAR_NOAUTOLOAD 2 // do not use script autoloading
#define EVAL_VAR_IMPORT 4 // may return special variable for import #define EVAL_VAR_IMPORT 4 // may return special variable for import
#define EVAL_VAR_NO_FUNC 8 // do not look for a function
// Maximum number of characters that can be fuzzy matched // Maximum number of characters that can be fuzzy matched
#define MAX_FUZZY_MATCHES 256 #define MAX_FUZZY_MATCHES 256