# HG changeset patch # User Bram Moolenaar # Date 1592748004 -7200 # Node ID 6b4b887a12f0e0b8bc863ffc7c9da9e6a0791b34 # Parent c297dfafbc7d40ed02ac826c1470607e429eaeef patch 8.2.1028: Vim9: no error for declaring buffer, window, etc. variable Commit: https://github.com/vim/vim/commit/e55b1c098d9dc04c960e6575bb554b5130af8989 Author: Bram Moolenaar Date: Sun Jun 21 15:52:59 2020 +0200 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. diff --git a/src/evalvars.c b/src/evalvars.c --- a/src/evalvars.c +++ b/src/evalvars.c @@ -1204,6 +1204,13 @@ ex_let_one( emsg(_("E996: Cannot lock an environment variable")); 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. ++arg; name = arg; @@ -2864,16 +2871,17 @@ set_var_const( semsg(_(e_illvar), name); return; } + is_script_local = ht == get_script_local_ht(); + if (current_sctx.sc_version == SCRIPT_VERSION_VIM9 - && ht == &globvarht - && (flags & LET_NO_COMMAND) == 0) + && !is_script_local + && (flags & LET_NO_COMMAND) == 0 + && name[1] == ':') { - semsg(_(e_declare_global), name); + vim9_declare_error(name); return; } - is_script_local = ht == get_script_local_ht(); - di = find_var_in_ht(ht, 0, varname, TRUE); // Search in parent scope which is possible to reference from lambda diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -1788,7 +1788,7 @@ EXTERN char e_no_white_before[] INIT(= N 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_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 #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) EXTERN char e_alloc_color[] INIT(= N_("E254: Cannot allocate color %s")); diff --git a/src/proto/vim9compile.pro b/src/proto/vim9compile.pro --- a/src/proto/vim9compile.pro +++ b/src/proto/vim9compile.pro @@ -10,6 +10,7 @@ int get_script_item_idx(int sid, char_u imported_T *find_imported(char_u *name, size_t len, cctx_T *cctx); char_u *to_name_const_end(char_u *arg); int assignment_len(char_u *p, int *heredoc); +void vim9_declare_error(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); void set_function_type(ufunc_T *ufunc); diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1059,7 +1059,7 @@ func Test_expr_fails() call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:') 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(["echo len('asdf'"], 'E110:') diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -322,15 +322,15 @@ def Test_assignment_failure() call CheckDefFailure(['let &option'], 'E1052:') 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 @a = 5'], 'E1066:') - call CheckDefFailure(['let g:var = 5'], 'E1016:') - call CheckDefFailure(['let w:var = 5'], 'E1079:') - call CheckDefFailure(['let b:var = 5'], 'E1078:') - call CheckDefFailure(['let t:var = 5'], 'E1080:') + call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') + call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') + call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') + call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') call CheckDefFailure(['let xnr += 4'], 'E1020:') @@ -1812,14 +1812,41 @@ def Test_vim9_comment_not_compiled() CheckScriptSuccess([ 'vim9script', 'g:var = 123', - 'let w:var = 777', + 'b:var = 456', + 'w:var = 777', + 't:var = 888', 'unlet g:var w:var # something', ]) CheckScriptFailure([ 'vim9script', '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([ 'vim9script', diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1028, +/**/ 1027, /**/ 1026, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -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: * "let var", "let var = expr", "const var = expr" and "var = expr" @@ -4855,8 +4872,7 @@ compile_assignment(char_u *arg, exarg_T type = &t_string; if (is_decl) { - semsg(_("E1065: Cannot declare an environment variable: %s"), - name); + vim9_declare_error(name); goto theend; } } @@ -4880,7 +4896,7 @@ compile_assignment(char_u *arg, exarg_T dest = dest_global; if (is_decl) { - semsg(_(e_declare_global), name); + vim9_declare_error(name); goto theend; } } @@ -4889,8 +4905,7 @@ compile_assignment(char_u *arg, exarg_T dest = dest_buffer; if (is_decl) { - semsg(_("E1078: Cannot declare a buffer variable: %s"), - name); + vim9_declare_error(name); goto theend; } } @@ -4899,8 +4914,7 @@ compile_assignment(char_u *arg, exarg_T dest = dest_window; if (is_decl) { - semsg(_("E1079: Cannot declare a window variable: %s"), - name); + vim9_declare_error(name); goto theend; } } @@ -4909,7 +4923,7 @@ compile_assignment(char_u *arg, exarg_T dest = dest_tab; if (is_decl) { - semsg(_("E1080: Cannot declare a tab variable: %s"), name); + vim9_declare_error(name); goto theend; } } @@ -4932,7 +4946,7 @@ compile_assignment(char_u *arg, exarg_T type = typval2type(vtv); if (is_decl) { - semsg(_("E1064: Cannot declare a v: variable: %s"), name); + vim9_declare_error(name); goto theend; } }