1
0
forked from aniani/vim

patch 8.2.1028: Vim9: no error for declaring buffer, window, etc. variable

Problem:    Vim9: no error for declaring buffer, window, etc. variable.
Solution:   Give an error.  Unify the error messages.
This commit is contained in:
Bram Moolenaar 2020-06-21 15:52:59 +02:00
parent 820ffa567c
commit e55b1c098d
7 changed files with 75 additions and 23 deletions

View File

@ -1204,6 +1204,13 @@ ex_let_one(
emsg(_("E996: Cannot lock an environment variable")); emsg(_("E996: Cannot lock an environment variable"));
return NULL; return NULL;
} }
if (current_sctx.sc_version == SCRIPT_VERSION_VIM9
&& (flags & LET_NO_COMMAND) == 0)
{
vim9_declare_error(arg);
return NULL;
}
// Find the end of the name. // Find the end of the name.
++arg; ++arg;
name = arg; name = arg;
@ -2864,16 +2871,17 @@ set_var_const(
semsg(_(e_illvar), name); semsg(_(e_illvar), name);
return; return;
} }
is_script_local = ht == get_script_local_ht();
if (current_sctx.sc_version == SCRIPT_VERSION_VIM9 if (current_sctx.sc_version == SCRIPT_VERSION_VIM9
&& ht == &globvarht && !is_script_local
&& (flags & LET_NO_COMMAND) == 0) && (flags & LET_NO_COMMAND) == 0
&& name[1] == ':')
{ {
semsg(_(e_declare_global), name); vim9_declare_error(name);
return; return;
} }
is_script_local = ht == get_script_local_ht();
di = find_var_in_ht(ht, 0, varname, TRUE); di = find_var_in_ht(ht, 0, varname, TRUE);
// Search in parent scope which is possible to reference from lambda // Search in parent scope which is possible to reference from lambda

View File

@ -1788,7 +1788,7 @@ EXTERN char e_no_white_before[] INIT(= N_("E1068: No white space allowed before
EXTERN char e_lock_unlock[] INIT(= N_("E940: Cannot lock or unlock variable %s")); EXTERN char e_lock_unlock[] INIT(= N_("E940: Cannot lock or unlock variable %s"));
EXTERN char e_const_req_value[] INIT(= N_("E1021: const requires a value")); EXTERN char e_const_req_value[] INIT(= N_("E1021: const requires a value"));
EXTERN char e_type_req[] INIT(= N_("E1022: type or initialization required")); EXTERN char e_type_req[] INIT(= N_("E1022: type or initialization required"));
EXTERN char e_declare_global[] INIT(= N_("E1016: Cannot declare a global variable: %s")); EXTERN char e_declare_var[] INIT(= N_("E1016: Cannot declare a%s variable: %s"));
#endif #endif
#if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
EXTERN char e_alloc_color[] INIT(= N_("E254: Cannot allocate color %s")); EXTERN char e_alloc_color[] INIT(= N_("E254: Cannot allocate color %s"));

View File

@ -10,6 +10,7 @@ int get_script_item_idx(int sid, char_u *name, int check_writable);
imported_T *find_imported(char_u *name, size_t len, cctx_T *cctx); imported_T *find_imported(char_u *name, size_t len, cctx_T *cctx);
char_u *to_name_const_end(char_u *arg); char_u *to_name_const_end(char_u *arg);
int assignment_len(char_u *p, int *heredoc); int assignment_len(char_u *p, int *heredoc);
void vim9_declare_error(char_u *name);
int check_vim9_unlet(char_u *name); int check_vim9_unlet(char_u *name);
int compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx); int compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx);
void set_function_type(ufunc_T *ufunc); void set_function_type(ufunc_T *ufunc);

View File

@ -1059,7 +1059,7 @@ func Test_expr_fails()
call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:') call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:')
call CheckDefFailure(["v:nosuch += 3"], 'E1001:') call CheckDefFailure(["v:nosuch += 3"], 'E1001:')
call CheckDefFailure(["let v:statusmsg = ''"], 'E1064:') call CheckDefFailure(["let v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:')
call CheckDefFailure(["let asdf = v:nosuch"], 'E1001:') call CheckDefFailure(["let asdf = v:nosuch"], 'E1001:')
call CheckDefFailure(["echo len('asdf'"], 'E110:') call CheckDefFailure(["echo len('asdf'"], 'E110:')

View File

@ -322,15 +322,15 @@ def Test_assignment_failure()
call CheckDefFailure(['let &option'], 'E1052:') call CheckDefFailure(['let &option'], 'E1052:')
call CheckDefFailure(['&g:option = 5'], 'E113:') call CheckDefFailure(['&g:option = 5'], 'E113:')
call CheckDefFailure(['let $VAR = 5'], 'E1065:') call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
call CheckDefFailure(['let @~ = 5'], 'E354:') call CheckDefFailure(['let @~ = 5'], 'E354:')
call CheckDefFailure(['let @a = 5'], 'E1066:') call CheckDefFailure(['let @a = 5'], 'E1066:')
call CheckDefFailure(['let g:var = 5'], 'E1016:') call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
call CheckDefFailure(['let w:var = 5'], 'E1079:') call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
call CheckDefFailure(['let b:var = 5'], 'E1078:') call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
call CheckDefFailure(['let t:var = 5'], 'E1080:') call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
call CheckDefFailure(['let xnr += 4'], 'E1020:') call CheckDefFailure(['let xnr += 4'], 'E1020:')
@ -1812,14 +1812,41 @@ def Test_vim9_comment_not_compiled()
CheckScriptSuccess([ CheckScriptSuccess([
'vim9script', 'vim9script',
'g:var = 123', 'g:var = 123',
'let w:var = 777', 'b:var = 456',
'w:var = 777',
't:var = 888',
'unlet g:var w:var # something', 'unlet g:var w:var # something',
]) ])
CheckScriptFailure([ CheckScriptFailure([
'vim9script', 'vim9script',
'let g:var = 123', 'let g:var = 123',
], 'E1016:') ], 'E1016: Cannot declare a global variable:')
CheckScriptFailure([
'vim9script',
'let b:var = 123',
], 'E1016: Cannot declare a buffer variable:')
CheckScriptFailure([
'vim9script',
'let w:var = 123',
], 'E1016: Cannot declare a window variable:')
CheckScriptFailure([
'vim9script',
'let t:var = 123',
], 'E1016: Cannot declare a tab variable:')
CheckScriptFailure([
'vim9script',
'let v:version = 123',
], 'E1016: Cannot declare a v: variable:')
CheckScriptFailure([
'vim9script',
'let $VARIABLE = "text"',
], 'E1016: Cannot declare an environment variable:')
CheckScriptFailure([ CheckScriptFailure([
'vim9script', 'vim9script',

View File

@ -754,6 +754,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 */
/**/
1028,
/**/ /**/
1027, 1027,
/**/ /**/

View File

@ -4659,6 +4659,23 @@ generate_loadvar(
} }
} }
void
vim9_declare_error(char_u *name)
{
char *scope = "";
switch (*name)
{
case 'g': scope = " global"; break;
case 'b': scope = " buffer"; break;
case 'w': scope = " window"; break;
case 't': scope = " tab"; break;
case 'v': scope = " v:"; break;
case '$': scope = "n environment"; break;
}
semsg(_(e_declare_var), scope, name);
}
/* /*
* Compile declaration and assignment: * Compile declaration and assignment:
* "let var", "let var = expr", "const var = expr" and "var = expr" * "let var", "let var = expr", "const var = expr" and "var = expr"
@ -4855,8 +4872,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
type = &t_string; type = &t_string;
if (is_decl) if (is_decl)
{ {
semsg(_("E1065: Cannot declare an environment variable: %s"), vim9_declare_error(name);
name);
goto theend; goto theend;
} }
} }
@ -4880,7 +4896,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
dest = dest_global; dest = dest_global;
if (is_decl) if (is_decl)
{ {
semsg(_(e_declare_global), name); vim9_declare_error(name);
goto theend; goto theend;
} }
} }
@ -4889,8 +4905,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
dest = dest_buffer; dest = dest_buffer;
if (is_decl) if (is_decl)
{ {
semsg(_("E1078: Cannot declare a buffer variable: %s"), vim9_declare_error(name);
name);
goto theend; goto theend;
} }
} }
@ -4899,8 +4914,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
dest = dest_window; dest = dest_window;
if (is_decl) if (is_decl)
{ {
semsg(_("E1079: Cannot declare a window variable: %s"), vim9_declare_error(name);
name);
goto theend; goto theend;
} }
} }
@ -4909,7 +4923,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
dest = dest_tab; dest = dest_tab;
if (is_decl) if (is_decl)
{ {
semsg(_("E1080: Cannot declare a tab variable: %s"), name); vim9_declare_error(name);
goto theend; goto theend;
} }
} }
@ -4932,7 +4946,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
type = typval2type(vtv); type = typval2type(vtv);
if (is_decl) if (is_decl)
{ {
semsg(_("E1064: Cannot declare a v: variable: %s"), name); vim9_declare_error(name);
goto theend; goto theend;
} }
} }