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:
@@ -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);
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user