To: vim_dev@googlegroups.com Subject: Patch 8.2.1028 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1028 Problem: Vim9: no error for declaring buffer, window, etc. variable. Solution: Give an error. Unify the error messages. Files: src/evalvars.c, src/globals.h, src/vim9compile.c, src/proto/vim9compile.pro, src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim *** ../vim-8.2.1027/src/evalvars.c 2020-06-20 22:50:44.171608245 +0200 --- src/evalvars.c 2020-06-21 15:50:21.598728537 +0200 *************** *** 1204,1209 **** --- 1204,1216 ---- 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,2879 **** semsg(_(e_illvar), name); return; } if (current_sctx.sc_version == SCRIPT_VERSION_VIM9 ! && ht == &globvarht ! && (flags & LET_NO_COMMAND) == 0) { ! semsg(_(e_declare_global), 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 --- 2871,2887 ---- semsg(_(e_illvar), name); return; } + is_script_local = ht == get_script_local_ht(); + if (current_sctx.sc_version == SCRIPT_VERSION_VIM9 ! && !is_script_local ! && (flags & LET_NO_COMMAND) == 0 ! && name[1] == ':') { ! vim9_declare_error(name); return; } di = find_var_in_ht(ht, 0, varname, TRUE); // Search in parent scope which is possible to reference from lambda *** ../vim-8.2.1027/src/globals.h 2020-06-20 22:50:44.171608245 +0200 --- src/globals.h 2020-06-21 15:42:22.731231050 +0200 *************** *** 1788,1794 **** 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")); #endif #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) EXTERN char e_alloc_color[] INIT(= N_("E254: Cannot allocate color %s")); --- 1788,1794 ---- 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_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")); *** ../vim-8.2.1027/src/vim9compile.c 2020-06-21 14:12:14.014668156 +0200 --- src/vim9compile.c 2020-06-21 15:42:15.039254482 +0200 *************** *** 4659,4664 **** --- 4659,4681 ---- } } + 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,4862 **** type = &t_string; if (is_decl) { ! semsg(_("E1065: Cannot declare an environment variable: %s"), ! name); goto theend; } } --- 4872,4878 ---- type = &t_string; if (is_decl) { ! vim9_declare_error(name); goto theend; } } *************** *** 4880,4886 **** dest = dest_global; if (is_decl) { ! semsg(_(e_declare_global), name); goto theend; } } --- 4896,4902 ---- dest = dest_global; if (is_decl) { ! vim9_declare_error(name); goto theend; } } *************** *** 4889,4896 **** dest = dest_buffer; if (is_decl) { ! semsg(_("E1078: Cannot declare a buffer variable: %s"), ! name); goto theend; } } --- 4905,4911 ---- dest = dest_buffer; if (is_decl) { ! vim9_declare_error(name); goto theend; } } *************** *** 4899,4906 **** dest = dest_window; if (is_decl) { ! semsg(_("E1079: Cannot declare a window variable: %s"), ! name); goto theend; } } --- 4914,4920 ---- dest = dest_window; if (is_decl) { ! vim9_declare_error(name); goto theend; } } *************** *** 4909,4915 **** dest = dest_tab; if (is_decl) { ! semsg(_("E1080: Cannot declare a tab variable: %s"), name); goto theend; } } --- 4923,4929 ---- dest = dest_tab; if (is_decl) { ! vim9_declare_error(name); goto theend; } } *************** *** 4932,4938 **** type = typval2type(vtv); if (is_decl) { ! semsg(_("E1064: Cannot declare a v: variable: %s"), name); goto theend; } } --- 4946,4952 ---- type = typval2type(vtv); if (is_decl) { ! vim9_declare_error(name); goto theend; } } *** ../vim-8.2.1027/src/proto/vim9compile.pro 2020-06-20 18:19:05.916877882 +0200 --- src/proto/vim9compile.pro 2020-06-21 15:34:13.916728111 +0200 *************** *** 10,15 **** --- 10,16 ---- 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); *** ../vim-8.2.1027/src/testdir/test_vim9_expr.vim 2020-06-21 14:12:14.014668156 +0200 --- src/testdir/test_vim9_expr.vim 2020-06-21 15:35:32.996484421 +0200 *************** *** 1059,1065 **** call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:') call CheckDefFailure(["v:nosuch += 3"], 'E1001:') ! call CheckDefFailure(["let v:statusmsg = ''"], 'E1064:') call CheckDefFailure(["let asdf = v:nosuch"], 'E1001:') call CheckDefFailure(["echo len('asdf'"], 'E110:') --- 1059,1065 ---- call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:') call CheckDefFailure(["v:nosuch += 3"], 'E1001:') ! call CheckDefFailure(["let v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:') call CheckDefFailure(["let asdf = v:nosuch"], 'E1001:') call CheckDefFailure(["echo len('asdf'"], 'E110:') *** ../vim-8.2.1027/src/testdir/test_vim9_script.vim 2020-06-20 22:50:44.175608236 +0200 --- src/testdir/test_vim9_script.vim 2020-06-21 15:47:41.142964476 +0200 *************** *** 322,336 **** call CheckDefFailure(['let &option'], 'E1052:') call CheckDefFailure(['&g:option = 5'], 'E113:') ! call CheckDefFailure(['let $VAR = 5'], 'E1065:') 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 anr = 4', 'anr ..= "text"'], 'E1019:') call CheckDefFailure(['let xnr += 4'], 'E1020:') --- 322,336 ---- call CheckDefFailure(['let &option'], 'E1052:') call CheckDefFailure(['&g:option = 5'], 'E113:') ! 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: 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,1825 **** CheckScriptSuccess([ 'vim9script', 'g:var = 123', ! 'let w:var = 777', 'unlet g:var w:var # something', ]) CheckScriptFailure([ 'vim9script', 'let g:var = 123', ! ], 'E1016:') CheckScriptFailure([ 'vim9script', --- 1812,1852 ---- CheckScriptSuccess([ 'vim9script', 'g:var = 123', ! 'b:var = 456', ! 'w:var = 777', ! 't:var = 888', 'unlet g:var w:var # something', ]) CheckScriptFailure([ 'vim9script', 'let g:var = 123', ! ], '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', *** ../vim-8.2.1027/src/version.c 2020-06-21 15:09:10.665865729 +0200 --- src/version.c 2020-06-21 15:50:40.726696578 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1028, /**/ -- I wonder, do vegetarians eat fruit bats? /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///