summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-29 19:18:00 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-29 19:18:00 +0200
commit33afa2447bdb0bdd15253c69a2cf6f9903685815 (patch)
treece6c8c150686419faa6fb762f8ae22a2054a6d7b /src
parentac7bf8c4bfcbb157a2db6b939927bf11edb6ba7b (diff)
patch 8.2.1320: Vim9: cannot declare some single letter variablesv8.2.1320
Problem: Vim9: cannot declare some single letter variables. Solution: Do not recognize a colon for a namespace for single letter variables. (closes #6547)
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_script.vim25
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c18
3 files changed, 38 insertions, 7 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index b491fa21a5..0166072f16 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -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()
diff --git a/src/version.c b/src/version.c
index 4b53df32d0..b81ac066a7 100644
--- 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 */
/**/
+ 1320,
+/**/
1319,
/**/
1318,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index cbb9231d8c..f1509048e4 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -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;
}