changeset 21024:02b03915855d v8.2.1063

patch 8.2.1063: Vim9: no line break allowed before || or && Commit: https://github.com/vim/vim/commit/be7ee488761a5582a5605197c3951a17f20d072e Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jun 26 21:38:51 2020 +0200 patch 8.2.1063: Vim9: no line break allowed before || or && Problem: Vim9: no line break allowed before || or &&. Solution: Check for operator after line break.
author Bram Moolenaar <Bram@vim.org>
date Fri, 26 Jun 2020 21:45:16 +0200
parents 71f6a958bd70
children 8463e5662d5b
files src/eval.c src/testdir/test_vim9_expr.vim src/version.c
diffstat 3 files changed, 60 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -1991,6 +1991,8 @@ eval1(char_u **arg, typval_T *rettv, eva
     static int
 eval2(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
 {
+    char_u	*p;
+    int		getnext;
     typval_T	var2;
     long	result;
     int		first;
@@ -2007,12 +2009,16 @@ eval2(char_u **arg, typval_T *rettv, eva
      */
     first = TRUE;
     result = FALSE;
-    while ((*arg)[0] == '|' && (*arg)[1] == '|')
+    p = eval_next_non_blank(*arg, evalarg, &getnext);
+    while (p[0] == '|' && p[1] == '|')
     {
 	evalarg_T   nested_evalarg;
 	int	    evaluate;
 	int	    orig_flags;
 
+	if (getnext)
+	    *arg = eval_next_line(evalarg);
+
 	if (evalarg == NULL)
 	{
 	    CLEAR_FIELD(nested_evalarg);
@@ -2061,6 +2067,8 @@ eval2(char_u **arg, typval_T *rettv, eva
 	    rettv->v_type = VAR_NUMBER;
 	    rettv->vval.v_number = result;
 	}
+
+	p = eval_next_non_blank(*arg, evalarg, &getnext);
     }
 
     return OK;
@@ -2078,6 +2086,8 @@ eval2(char_u **arg, typval_T *rettv, eva
     static int
 eval3(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
 {
+    char_u	*p;
+    int		getnext;
     typval_T	var2;
     long	result;
     int		first;
@@ -2094,12 +2104,16 @@ eval3(char_u **arg, typval_T *rettv, eva
      */
     first = TRUE;
     result = TRUE;
-    while ((*arg)[0] == '&' && (*arg)[1] == '&')
+    p = eval_next_non_blank(*arg, evalarg, &getnext);
+    while (p[0] == '&' && p[1] == '&')
     {
 	evalarg_T   nested_evalarg;
 	int	    orig_flags;
 	int	    evaluate;
 
+	if (getnext)
+	    *arg = eval_next_line(evalarg);
+
 	if (evalarg == NULL)
 	{
 	    CLEAR_FIELD(nested_evalarg);
@@ -2147,6 +2161,8 @@ eval3(char_u **arg, typval_T *rettv, eva
 	    rettv->v_type = VAR_NUMBER;
 	    rettv->vval.v_number = result;
 	}
+
+	p = eval_next_non_blank(*arg, evalarg, &getnext);
     }
 
     return OK;
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -117,6 +117,26 @@ def Test_expr2()
   assert_equal([[], '', 0], g:vals)
 enddef
 
+def Test_expr2_vimscript()
+  " only checks line continuation
+  let lines =<< trim END
+      vim9script
+      let var = 0
+      		|| 1
+      assert_equal(1, var)
+  END
+  CheckScriptSuccess(lines)
+
+  lines =<< trim END
+      vim9script
+      let var = v:false
+      		|| v:true
+      		|| v:false
+      assert_equal(1, var)
+  END
+  CheckScriptSuccess(lines)
+enddef
+
 func Test_expr2_fails()
   let msg = "white space required before and after '||'"
   call CheckDefFailure(["let x = 1||2"], msg)
@@ -160,6 +180,26 @@ def Test_expr3()
   assert_equal([[1], 'z', 0], g:vals)
 enddef
 
+def Test_expr3_vimscript()
+  " only checks line continuation
+  let lines =<< trim END
+      vim9script
+      let var = 0
+      		&& 1
+      assert_equal(0, var)
+  END
+  CheckScriptSuccess(lines)
+
+  lines =<< trim END
+      vim9script
+      let var = v:true
+      		&& v:true
+      		&& v:true
+      assert_equal(1, var)
+  END
+  CheckScriptSuccess(lines)
+enddef
+
 func Test_expr3_fails()
   let msg = "white space required before and after '&&'"
   call CheckDefFailure(["let x = 1&&2"], msg)
--- 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 */
 /**/
+    1063,
+/**/
     1062,
 /**/
     1061,