diff src/list.c @ 21028:7acceb76669f v8.2.1065

patch 8.2.1065: Vim9: no line break allowed inside a list Commit: https://github.com/vim/vim/commit/7147820cb978f5b179cfec2f9d8b7774e28d43e0 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jun 26 22:46:27 2020 +0200 patch 8.2.1065: Vim9: no line break allowed inside a list Problem: Vim9: no line break allowed inside a list. Solution: Handle line break inside a list in Vim9 script.
author Bram Moolenaar <Bram@vim.org>
date Fri, 26 Jun 2020 23:00:05 +0200
parents 3b29ac3394dc
children f58ee30d863f
line wrap: on
line diff
--- a/src/list.c
+++ b/src/list.c
@@ -1156,19 +1156,19 @@ f_join(typval_T *argvars, typval_T *rett
 
 /*
  * Allocate a variable for a List and fill it from "*arg".
+ * "*arg" points to the "[".
  * Return OK or FAIL.
  */
     int
-get_list_tv(char_u **arg, typval_T *rettv, int flags, int do_error)
+get_list_tv(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int do_error)
 {
-    int		evaluate = flags & EVAL_EVALUATE;
+    int		evaluate = evalarg == NULL ? FALSE
+					 : evalarg->eval_flags & EVAL_EVALUATE;
+    int		getnext;
     list_T	*l = NULL;
     typval_T	tv;
     listitem_T	*item;
-    evalarg_T	evalarg;
-
-    CLEAR_FIELD(evalarg);
-    evalarg.eval_flags = flags;
+    int		had_comma;
 
     if (evaluate)
     {
@@ -1178,9 +1178,12 @@ get_list_tv(char_u **arg, typval_T *rett
     }
 
     *arg = skipwhite(*arg + 1);
+    eval_next_non_blank(*arg, evalarg, &getnext);
+    if (getnext)
+	*arg = eval_next_line(evalarg);
     while (**arg != ']' && **arg != NUL)
     {
-	if (eval1(arg, &tv, &evalarg) == FAIL)	// recursive!
+	if (eval1(arg, &tv, evalarg) == FAIL)	// recursive!
 	    goto failret;
 	if (evaluate)
 	{
@@ -1195,15 +1198,24 @@ get_list_tv(char_u **arg, typval_T *rett
 		clear_tv(&tv);
 	}
 
+	// the comma must comma after the value
+	had_comma = **arg == ',';
+	if (had_comma)
+	    *arg = skipwhite(*arg + 1);
+
+	// the "]" can be on the next line
+	eval_next_non_blank(*arg, evalarg, &getnext);
+	if (getnext)
+	    *arg = eval_next_line(evalarg);
 	if (**arg == ']')
 	    break;
-	if (**arg != ',')
+
+	if (!had_comma)
 	{
 	    if (do_error)
 		semsg(_("E696: Missing comma in List: %s"), *arg);
 	    goto failret;
 	}
-	*arg = skipwhite(*arg + 1);
     }
 
     if (**arg != ']')