]> granicus.if.org Git - vim/commitdiff
patch 8.2.1320: Vim9: cannot declare some single letter variables v8.2.1320
authorBram Moolenaar <Bram@vim.org>
Wed, 29 Jul 2020 17:18:00 +0000 (19:18 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 29 Jul 2020 17:18:00 +0000 (19:18 +0200)
Problem:    Vim9: cannot declare some single letter variables.
Solution:   Do not recognize a colon for a namespace for single letter
            variables. (closes #6547)

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index b491fa21a585ad1d6d37dc315e0e3b014136ce25..0166072f16b6e714d658d155ba87d2d949332258 100644 (file)
@@ -109,6 +109,9 @@ def Test_assignment()
   call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
   &ts = 8
 
+  call CheckDefFailure(['let s:var = 123'], 'E1101:')
+  call CheckDefFailure(['let s:var: number'], 'E1101:')
+
   g:inc_counter += 1
   assert_equal(2, g:inc_counter)
 
@@ -136,6 +139,28 @@ def Test_assignment()
   assert_equal('noneagain', v:errmsg)
   call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
   call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
+
+  # single letter variables
+  a = 123
+  assert_equal(123, a)
+  let b: number
+  b = 123
+  assert_equal(123, b)
+  let g: number
+  g = 123
+  assert_equal(123, g)
+  let s: number
+  s = 123
+  assert_equal(123, s)
+  let t: number
+  t = 123
+  assert_equal(123, t)
+  let v: number
+  v = 123
+  assert_equal(123, v)
+  let w: number
+  w = 123
+  assert_equal(123, w)
 enddef
 
 def Test_vim9_single_char_vars()
index 4b53df32d0e1d2beb7f89f1eef4fcdd8854c2fe1..b81ac066a75e735cf3d02e5262cedc1f5aaf61a2 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1320,
 /**/
     1319,
 /**/
index cbb9231d8cf0049e45ea23bf90afa31bf083cd9d..f1509048e4df1558fa12e15224eee75d355ddd30 100644 (file)
@@ -5237,7 +5237,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
                    goto theend;
                }
            }
-           else if (STRNCMP(var_start, "g:", 2) == 0)
+           else if (varlen > 1 && STRNCMP(var_start, "g:", 2) == 0)
            {
                dest = dest_global;
                if (is_decl)
@@ -5246,7 +5246,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
                    goto theend;
                }
            }
-           else if (STRNCMP(var_start, "b:", 2) == 0)
+           else if (varlen > 1 && STRNCMP(var_start, "b:", 2) == 0)
            {
                dest = dest_buffer;
                if (is_decl)
@@ -5255,7 +5255,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
                    goto theend;
                }
            }
-           else if (STRNCMP(var_start, "w:", 2) == 0)
+           else if (varlen > 1 && STRNCMP(var_start, "w:", 2) == 0)
            {
                dest = dest_window;
                if (is_decl)
@@ -5264,7 +5264,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
                    goto theend;
                }
            }
-           else if (STRNCMP(var_start, "t:", 2) == 0)
+           else if (varlen > 1 && STRNCMP(var_start, "t:", 2) == 0)
            {
                dest = dest_tab;
                if (is_decl)
@@ -5273,7 +5273,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
                    goto theend;
                }
            }
-           else if (STRNCMP(var_start, "v:", 2) == 0)
+           else if (varlen > 1 && STRNCMP(var_start, "v:", 2) == 0)
            {
                typval_T        *vtv;
                int             di_flags;
@@ -5337,14 +5337,18 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
                        goto theend;
                    }
                }
-               else if (STRNCMP(var_start, "s:", 2) == 0
+               else if ((varlen > 1 && STRNCMP(var_start, "s:", 2) == 0)
                        || lookup_script(var_start, varlen) == OK
                        || find_imported(var_start, varlen, cctx) != NULL)
                {
                    dest = dest_script;
                    if (is_decl)
                    {
-                       semsg(_("E1054: Variable already declared in the script: %s"),
+                       if ((varlen > 1 && STRNCMP(var_start, "s:", 2) == 0))
+                           semsg(_("E1101: Cannot declare a script variable in a function: %s"),
+                                                                        name);
+                       else
+                           semsg(_("E1054: Variable already declared in the script: %s"),
                                                                         name);
                        goto theend;
                    }