Mercurial > vim
changeset 21644:7d3ba70a03f1 v8.2.1372
patch 8.2.1372: Vim9: no error for missing white space around operator
Commit: https://github.com/vim/vim/commit/fdac71c5075062f97f77044e9619fa5c907e0327
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Aug 5 12:44:41 2020 +0200
patch 8.2.1372: Vim9: no error for missing white space around operator
Problem: Vim9: no error for missing white space around operator.
Solution: Check for white space around ? and :.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 05 Aug 2020 12:45:04 +0200 |
parents | 08894a73765b |
children | 5c2e5c71c08c |
files | src/eval.c src/testdir/test_vim9_expr.vim src/version.c |
diffstat | 3 files changed, 61 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -2072,7 +2072,7 @@ eval0( * expr2 ? expr1 : expr1 * * "arg" must point to the first non-white of the expression. - * "arg" is advanced to the next non-white after the recognized expression. + * "arg" is advanced to just after the recognized expression. * * Note: "rettv.v_lock" is not set. * @@ -2111,7 +2111,15 @@ eval1(char_u **arg, typval_T *rettv, eva if (getnext) *arg = eval_next_line(evalarg_used); else + { + if (evaluate && in_vim9script() && !VIM_ISWHITE(p[-1])) + { + error_white_both(p, 1); + clear_tv(rettv); + return FAIL; + } *arg = p; + } result = FALSE; if (evaluate) @@ -2128,6 +2136,12 @@ eval1(char_u **arg, typval_T *rettv, eva /* * Get the second variable. Recursive! */ + if (evaluate && in_vim9script() && !IS_WHITE_OR_NUL((*arg)[1])) + { + error_white_both(p, 1); + clear_tv(rettv); + return FAIL; + } *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); evalarg_used->eval_flags = result ? orig_flags : orig_flags & ~EVAL_EVALUATE; @@ -2148,11 +2162,25 @@ eval1(char_u **arg, typval_T *rettv, eva if (getnext) *arg = eval_next_line(evalarg_used); else + { + if (evaluate && in_vim9script() && !VIM_ISWHITE(p[-1])) + { + error_white_both(p, 1); + clear_tv(rettv); + return FAIL; + } *arg = p; + } /* * Get the third variable. Recursive! */ + if (evaluate && in_vim9script() && !IS_WHITE_OR_NUL((*arg)[1])) + { + error_white_both(p, 1); + clear_tv(rettv); + return FAIL; + } *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); evalarg_used->eval_flags = !result ? orig_flags : orig_flags & ~EVAL_EVALUATE; @@ -2179,7 +2207,7 @@ eval1(char_u **arg, typval_T *rettv, eva * expr2 || expr2 || expr2 logical OR * * "arg" must point to the first non-white of the expression. - * "arg" is advanced to the next non-white after the recognized expression. + * "arg" is advanced to just after the recognized expression. * * Return OK or FAIL. */ @@ -2310,7 +2338,7 @@ eval2(char_u **arg, typval_T *rettv, eva * expr3 && expr3 && expr3 logical AND * * "arg" must point to the first non-white of the expression. - * "arg" is advanced to the next non-white after the recognized expression. + * "arg" is advanced to just after the recognized expression. * * Return OK or FAIL. */
--- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -60,7 +60,7 @@ def Test_expr1() enddef def Test_expr1_vimscript() - # only checks line continuation + # check line continuation let lines =<< trim END vim9script let var = 1 @@ -87,6 +87,33 @@ def Test_expr1_vimscript() assert_equal('no', var) END CheckScriptSuccess(lines) + + # check white space + lines =<< trim END + vim9script + let var = v:true?1:2 + END + CheckScriptFailure(lines, 'E1004:') + lines =<< trim END + vim9script + let var = v:true? 1 : 2 + END + CheckScriptFailure(lines, 'E1004:') + lines =<< trim END + vim9script + let var = v:true ?1 : 2 + END + CheckScriptFailure(lines, 'E1004:') + lines =<< trim END + vim9script + let var = v:true ? 1: 2 + END + CheckScriptFailure(lines, 'E1004:') + lines =<< trim END + vim9script + let var = v:true ? 1 :2 + END + CheckScriptFailure(lines, 'E1004:') enddef func Test_expr1_fails()