diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-07-23 13:11:37 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-07-23 13:11:37 +0200 |
commit | 63be3d4ba01d565e645d8bf7f4dc900fc9011534 (patch) | |
tree | 52375a30387a79924200a31e33a5a574bb9202dd | |
parent | c69950ac17225d07f973b39d5b0eb94291077808 (diff) |
patch 8.2.1274: Vim9: no error for missing white space at script levelv8.2.1274
Problem: Vim9: no error for missing white space in assignment at script
level.
Solution: Check for white space. (closes #6495)
-rw-r--r-- | src/eval.c | 3 | ||||
-rw-r--r-- | src/evalvars.c | 28 | ||||
-rw-r--r-- | src/testdir/test_let.vim | 4 | ||||
-rw-r--r-- | src/testdir/test_vim9_script.vim | 9 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 36 insertions, 10 deletions
diff --git a/src/eval.c b/src/eval.c index a8e388db01..bb75528ca7 100644 --- a/src/eval.c +++ b/src/eval.c @@ -4996,7 +4996,8 @@ find_name_end( for (p = arg; *p != NUL && (eval_isnamec(*p) || (*p == '{' && !vim9script) - || ((flags & FNE_INCL_BR) && (*p == '[' || *p == '.')) + || ((flags & FNE_INCL_BR) && (*p == '[' + || (*p == '.' && eval_isnamec1(p[1])))) || mb_nest != 0 || br_nest != 0); MB_PTR_ADV(p)) { diff --git a/src/evalvars.c b/src/evalvars.c index e2469b0e82..564c65b8aa 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -698,12 +698,13 @@ ex_let(exarg_T *eap) int i; int var_count = 0; int semicolon = 0; - char_u op[2]; + char_u op[4]; char_u *argend; int first = TRUE; int concat; int has_assign; int flags = eap->cmdidx == CMD_const ? LET_IS_CONST : 0; + int vim9script = in_vim9script(); // detect Vim9 assignment without ":let" or ":const" if (eap->arg == eap->cmd) @@ -725,11 +726,11 @@ ex_let(exarg_T *eap) // ":let" without "=": list variables if (*arg == '[') emsg(_(e_invarg)); - else if (expr[0] == '.') - emsg(_("E985: .= is not supported with script version 2")); + else if (expr[0] == '.' && expr[1] == '=') + emsg(_("E985: .= is not supported with script version >= 2")); else if (!ends_excmd2(eap->cmd, arg)) { - if (in_vim9script()) + if (vim9script) { // Vim9 declaration ":let var: type" arg = vim9_declare_scriptvar(eap, arg); @@ -775,6 +776,7 @@ ex_let(exarg_T *eap) else { evalarg_T evalarg; + int len = 1; rettv.v_type = VAR_UNKNOWN; i = FAIL; @@ -787,13 +789,25 @@ ex_let(exarg_T *eap) if (vim_strchr((char_u *)"+-*/%.", *expr) != NULL) { op[0] = *expr; // +=, -=, *=, /=, %= or .= + ++len; if (expr[0] == '.' && expr[1] == '.') // ..= + { ++expr; + ++len; + } } - expr = skipwhite(expr + 2); + expr += 2; } else - expr = skipwhite(expr + 1); + ++expr; + + if (vim9script && (!VIM_ISWHITE(*argend) || !VIM_ISWHITE(*expr))) + { + vim_strncpy(op, expr - len, len); + semsg(_(e_white_both), op); + i = FAIL; + } + expr = skipwhite(expr); if (eap->skip) ++emsg_skip; @@ -817,7 +831,7 @@ ex_let(exarg_T *eap) else if (i != FAIL) { (void)ex_let_vars(eap->arg, &rettv, FALSE, semicolon, var_count, - flags, op); + flags, op); clear_tv(&rettv); } } diff --git a/src/testdir/test_let.vim b/src/testdir/test_let.vim index 404fe15754..9a399e8f38 100644 --- a/src/testdir/test_let.vim +++ b/src/testdir/test_let.vim @@ -293,12 +293,12 @@ func Test_let_errors() let s = "var" let var = 1 call assert_fails('let var += [1,2]', 'E734:') - call assert_fails('let {s}.1 = 2', 'E18:') + call assert_fails('let {s}.1 = 2', 'E15:') call assert_fails('let a[1] = 5', 'E121:') let l = [[1,2]] call assert_fails('let l[:][0] = [5]', 'E708:') let d = {'k' : 4} - call assert_fails('let d.# = 5', 'E713:') + call assert_fails('let d.# = 5', 'E488:') call assert_fails('let d.m += 5', 'E734:') call assert_fails('let m = d[{]', 'E15:') let l = [1, 2] diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 36d7e89c73..fd572d742f 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -318,6 +318,15 @@ def Test_assignment_failure() call CheckDefFailure(['let var =234'], 'E1004:') call CheckDefFailure(['let var= 234'], 'E1004:') + call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') + call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") + call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') + call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') + call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') + call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") + call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') + call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") + call CheckDefFailure(['let true = 1'], 'E1034:') call CheckDefFailure(['let false = 1'], 'E1034:') diff --git a/src/version.c b/src/version.c index ed8f6c4685..82b5780b4e 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 */ /**/ + 1274, +/**/ 1273, /**/ 1272, |