changeset 20953:6b4b887a12f0 v8.2.1028

patch 8.2.1028: Vim9: no error for declaring buffer, window, etc. variable Commit: https://github.com/vim/vim/commit/e55b1c098d9dc04c960e6575bb554b5130af8989 Author: Bram Moolenaar <Bram@vim.org> 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.
author Bram Moolenaar <Bram@vim.org>
date Sun, 21 Jun 2020 16:00:04 +0200
parents c297dfafbc7d
children fef8406c5c10
files src/evalvars.c src/globals.h src/proto/vim9compile.pro src/testdir/test_vim9_expr.vim src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c
diffstat 7 files changed, 75 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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"));
--- 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);
--- 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:')
--- 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',
--- 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,
--- 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;
 		}
 	    }