]> granicus.if.org Git - vim/commitdiff
patch 8.2.1028: Vim9: no error for declaring buffer, window, etc. variable v8.2.1028
authorBram Moolenaar <Bram@vim.org>
Sun, 21 Jun 2020 13:52:59 +0000 (15:52 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 21 Jun 2020 13:52:59 +0000 (15:52 +0200)
Problem:    Vim9: no error for declaring buffer, window, etc. variable.
Solution:   Give an error.  Unify the error messages.

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

index 91883ddc40d1190a6872be62d00a9f9cd0a2d90a..b3e89150ad4eded84f0d06c19548705d191d68d2 100644 (file)
@@ -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
index b6356a360098a182a55b82ba6ba2f6a055087d93..5dc139eebba84c81b15c9ae53d18703ac8d30616 100644 (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_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"));
index 0db5fc7fc3013e8983349459517119a7d9daf9f0..040e4d7eb7acb6c828e13c3d07ed3b9fabb6d91f 100644 (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);
 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);
index 05a3cd6d3d06483d36958704deb7813b49d463af..f87e920b2398fee6b64e45721b7610464480e74c 100644 (file)
@@ -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:')
index ec1fc87310eec3b7c46bb2f4dbfdde5641d312ab..a733bf168b463b1358bf7780dd914162910f970d 100644 (file)
@@ -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',
index b78659134a14adf6043e6a8429e5662ce0f16267..77fdac13993a0488b2f65f984f3cd08558c7469f 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1028,
 /**/
     1027,
 /**/
index 5b440940eed7bafa7549ea0bea1f7ae6714251a3..3b021afdcb4eb4b9bc73e75ea7ce31d3c236c747 100644 (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:
  * "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;
                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 *eap, cmdidx_T cmdidx, cctx_T *cctx)
                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 *eap, cmdidx_T cmdidx, cctx_T *cctx)
                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 *eap, cmdidx_T cmdidx, cctx_T *cctx)
                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 *eap, cmdidx_T cmdidx, cctx_T *cctx)
                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 *eap, cmdidx_T cmdidx, cctx_T *cctx)
                type = typval2type(vtv);
                if (is_decl)
                {
-                   semsg(_("E1064: Cannot declare a v: variable: %s"), name);
+                   vim9_declare_error(name);
                    goto theend;
                }
            }