To: vim_dev@googlegroups.com Subject: Patch 8.2.1074 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1074 Problem: Vim9: no line break allowed after some operators. Solution: Skip a line break after the operator. Add eval_may_get_next_line() to simplify checking for a line break. Files: src/eval.c, src/proto/eval.pro, src/dict.c, src/list.c, src/userfunc.c, src/testdir/test_vim9_expr.vim *** ../vim-8.2.1073/src/eval.c 2020-06-27 20:46:26.058241052 +0200 --- src/eval.c 2020-06-27 21:16:08.835674580 +0200 *************** *** 1871,1876 **** --- 1871,1888 ---- return skipwhite(line); } + char_u * + skipwhite_and_linebreak(char_u *arg, evalarg_T *evalarg) + { + int getnext; + char_u *p = skipwhite(arg); + + eval_next_non_blank(p, evalarg, &getnext); + if (getnext) + return eval_next_line(evalarg); + return p; + } + /* * The "evaluate" argument: When FALSE, the argument is only parsed but not * executed. The function may return OK, but the rettv will be of type *************** *** 1998,2004 **** /* * Get the second variable. Recursive! */ ! *arg = skipwhite(*arg + 1); nested_evalarg.eval_flags = result ? orig_flags : orig_flags & ~EVAL_EVALUATE; if (eval1(arg, rettv, &nested_evalarg) == FAIL) --- 2010,2016 ---- /* * Get the second variable. Recursive! */ ! *arg = skipwhite_and_linebreak(*arg + 1, evalarg); nested_evalarg.eval_flags = result ? orig_flags : orig_flags & ~EVAL_EVALUATE; if (eval1(arg, rettv, &nested_evalarg) == FAIL) *************** *** 2021,2027 **** /* * Get the third variable. Recursive! */ ! *arg = skipwhite(*arg + 1); nested_evalarg.eval_flags = !result ? orig_flags : orig_flags & ~EVAL_EVALUATE; if (eval1(arg, &var2, &nested_evalarg) == FAIL) --- 2033,2039 ---- /* * Get the third variable. Recursive! */ ! *arg = skipwhite_and_linebreak(*arg + 1, evalarg); nested_evalarg.eval_flags = !result ? orig_flags : orig_flags & ~EVAL_EVALUATE; if (eval1(arg, &var2, &nested_evalarg) == FAIL) *************** *** 2103,2109 **** /* * Get the second variable. */ ! *arg = skipwhite(*arg + 2); nested_evalarg.eval_flags = !result ? orig_flags : orig_flags & ~EVAL_EVALUATE; if (eval3(arg, &var2, &nested_evalarg) == FAIL) --- 2115,2121 ---- /* * Get the second variable. */ ! *arg = skipwhite_and_linebreak(*arg + 2, evalarg); nested_evalarg.eval_flags = !result ? orig_flags : orig_flags & ~EVAL_EVALUATE; if (eval3(arg, &var2, &nested_evalarg) == FAIL) *************** *** 2197,2203 **** /* * Get the second variable. */ ! *arg = skipwhite(*arg + 2); nested_evalarg.eval_flags = result ? orig_flags : orig_flags & ~EVAL_EVALUATE; if (eval4(arg, &var2, &nested_evalarg) == FAIL) --- 2209,2215 ---- /* * Get the second variable. */ ! *arg = skipwhite_and_linebreak(*arg + 2, evalarg); nested_evalarg.eval_flags = result ? orig_flags : orig_flags & ~EVAL_EVALUATE; if (eval4(arg, &var2, &nested_evalarg) == FAIL) *************** *** 2328,2334 **** /* * Get the second variable. */ ! *arg = skipwhite(p + len); if (eval5(arg, &var2, evalarg) == FAIL) { clear_tv(rettv); --- 2340,2346 ---- /* * Get the second variable. */ ! *arg = skipwhite_and_linebreak(p + len, evalarg); if (eval5(arg, &var2, evalarg) == FAIL) { clear_tv(rettv); *************** *** 2452,2461 **** */ if (op == '.' && *(*arg + 1) == '.') // .. string concatenation ++*arg; ! *arg = skipwhite(*arg + 1); ! eval_next_non_blank(*arg, evalarg, &getnext); ! if (getnext) ! *arg = eval_next_line(evalarg); if (eval6(arg, &var2, evalarg, op == '.') == FAIL) { clear_tv(rettv); --- 2464,2470 ---- */ if (op == '.' && *(*arg + 1) == '.') // .. string concatenation ++*arg; ! *arg = skipwhite_and_linebreak(*arg + 1, evalarg); if (eval6(arg, &var2, evalarg, op == '.') == FAIL) { clear_tv(rettv); *************** *** 2893,2910 **** * nested expression: (expression). */ case '(': { ! int getnext; ! ! *arg = skipwhite(*arg + 1); ! eval_next_non_blank(*arg, evalarg, &getnext); ! if (getnext) ! *arg = eval_next_line(evalarg); ! ret = eval1(arg, rettv, evalarg); // recursive! ! eval_next_non_blank(*arg, evalarg, &getnext); ! if (getnext) ! *arg = eval_next_line(evalarg); if (**arg == ')') ++*arg; else if (ret == OK) --- 2902,2911 ---- * nested expression: (expression). */ case '(': { ! *arg = skipwhite_and_linebreak(*arg + 1, evalarg); ret = eval1(arg, rettv, evalarg); // recursive! ! *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg == ')') ++*arg; else if (ret == OK) *** ../vim-8.2.1073/src/proto/eval.pro 2020-06-27 18:06:42.148575132 +0200 --- src/proto/eval.pro 2020-06-27 21:16:21.727618968 +0200 *************** *** 29,34 **** --- 29,35 ---- int pattern_match(char_u *pat, char_u *text, int ic); char_u *eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext); char_u *eval_next_line(evalarg_T *evalarg); + char_u *skipwhite_and_linebreak(char_u *arg, evalarg_T *evalarg); int eval0(char_u *arg, typval_T *rettv, exarg_T *eap, evalarg_T *evalarg); int eval1(char_u **arg, typval_T *rettv, evalarg_T *evalarg); void eval_addblob(typval_T *tv1, typval_T *tv2); *** ../vim-8.2.1073/src/dict.c 2020-06-27 17:04:01.298972727 +0200 --- src/dict.c 2020-06-27 21:15:59.807713514 +0200 *************** *** 805,811 **** char_u buf[NUMBUFLEN]; int vim9script = current_sctx.sc_version == SCRIPT_VERSION_VIM9; int had_comma; - int getnext; /* * First check if it's not a curly-braces thing: {expr}. --- 805,810 ---- *************** *** 831,840 **** tvkey.v_type = VAR_UNKNOWN; tv.v_type = VAR_UNKNOWN; ! *arg = skipwhite(*arg + 1); ! eval_next_non_blank(*arg, evalarg, &getnext); ! if (getnext) ! *arg = eval_next_line(evalarg); while (**arg != '}' && **arg != NUL) { if ((literal --- 830,836 ---- tvkey.v_type = VAR_UNKNOWN; tv.v_type = VAR_UNKNOWN; ! *arg = skipwhite_and_linebreak(*arg + 1, evalarg); while (**arg != '}' && **arg != NUL) { if ((literal *************** *** 866,875 **** goto failret; } ! *arg = skipwhite(*arg + 1); ! eval_next_non_blank(*arg, evalarg, &getnext); ! if (getnext) ! *arg = eval_next_line(evalarg); if (eval1(arg, &tv, evalarg) == FAIL) // recursive! { if (evaluate) --- 862,868 ---- goto failret; } ! *arg = skipwhite_and_linebreak(*arg + 1, evalarg); if (eval1(arg, &tv, evalarg) == FAIL) // recursive! { if (evaluate) *************** *** 911,919 **** } // 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 (!had_comma) --- 904,910 ---- } // the "}" can be on the next line ! *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg == '}') break; if (!had_comma) *** ../vim-8.2.1073/src/list.c 2020-06-27 16:36:01.908867818 +0200 --- src/list.c 2020-06-27 21:16:12.355659400 +0200 *************** *** 1164,1170 **** { int evaluate = evalarg == NULL ? FALSE : evalarg->eval_flags & EVAL_EVALUATE; - int getnext; list_T *l = NULL; typval_T tv; listitem_T *item; --- 1164,1169 ---- *************** *** 1178,1187 **** return FAIL; } ! *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! --- 1177,1183 ---- return FAIL; } ! *arg = skipwhite_and_linebreak(*arg + 1, evalarg); while (**arg != ']' && **arg != NUL) { if (eval1(arg, &tv, evalarg) == FAIL) // recursive! *************** *** 1212,1220 **** } // the "]" can be on the next line ! eval_next_non_blank(*arg, evalarg, &getnext); ! if (getnext) ! *arg = eval_next_line(evalarg); if (**arg == ']') break; --- 1208,1214 ---- } // the "]" can be on the next line ! *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg == ']') break; *** ../vim-8.2.1073/src/userfunc.c 2020-06-27 18:06:42.152575113 +0200 --- src/userfunc.c 2020-06-27 21:17:38.351287999 +0200 *************** *** 402,418 **** partial_T *pt = NULL; int varargs; int ret; ! char_u *start = skipwhite(*arg + 1); char_u *s, *e; int *old_eval_lavars = eval_lavars_used; int eval_lavars = FALSE; - int getnext; char_u *tofree = NULL; ga_init(&newargs); ga_init(&newlines); // First, check if this is a lambda expression. "->" must exist. ret = get_function_args(&start, '-', NULL, NULL, NULL, NULL, TRUE, NULL, NULL); if (ret == FAIL || *start != '>') --- 402,418 ---- partial_T *pt = NULL; int varargs; int ret; ! char_u *start; char_u *s, *e; int *old_eval_lavars = eval_lavars_used; int eval_lavars = FALSE; char_u *tofree = NULL; ga_init(&newargs); ga_init(&newlines); // First, check if this is a lambda expression. "->" must exist. + start = skipwhite(*arg + 1); ret = get_function_args(&start, '-', NULL, NULL, NULL, NULL, TRUE, NULL, NULL); if (ret == FAIL || *start != '>') *************** *** 435,444 **** eval_lavars_used = &eval_lavars; // Get the start and the end of the expression. ! *arg = skipwhite(*arg + 1); ! eval_next_non_blank(*arg, evalarg, &getnext); ! if (getnext) ! *arg = eval_next_line(evalarg); s = *arg; ret = skip_expr_concatenate(&s, arg, evalarg); if (ret == FAIL) --- 435,441 ---- eval_lavars_used = &eval_lavars; // Get the start and the end of the expression. ! *arg = skipwhite_and_linebreak(*arg + 1, evalarg); s = *arg; ret = skip_expr_concatenate(&s, arg, evalarg); if (ret == FAIL) *************** *** 451,460 **** } e = *arg; ! *arg = skipwhite(*arg); ! eval_next_non_blank(*arg, evalarg, &getnext); ! if (getnext) ! *arg = eval_next_line(evalarg); if (**arg != '}') { semsg(_("E451: Expected }: %s"), *arg); --- 448,454 ---- } e = *arg; ! *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg != '}') { semsg(_("E451: Expected }: %s"), *arg); *** ../vim-8.2.1073/src/testdir/test_vim9_expr.vim 2020-06-27 20:46:26.058241052 +0200 --- src/testdir/test_vim9_expr.vim 2020-06-27 20:51:57.665405815 +0200 *************** *** 64,69 **** --- 64,78 ---- assert_equal('no', var) END CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + let var = v:false ? + 'yes' : + 'no' + assert_equal('no', var) + END + CheckScriptSuccess(lines) enddef func Test_expr1_fails() *************** *** 135,140 **** --- 144,158 ---- 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() *************** *** 198,203 **** --- 216,230 ---- assert_equal(1, 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() *************** *** 547,552 **** --- 574,587 ---- END CheckScriptSuccess(lines) + lines =<< trim END + vim9script + let var = 123 == + 123 + assert_equal(1, var) + END + CheckScriptSuccess(lines) + lines =<< trim END vim9script let list = [1, 2, 3] *** ../vim-8.2.1073/src/version.c 2020-06-27 20:46:26.058241052 +0200 --- src/version.c 2020-06-27 20:48:55.069915608 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1074, /**/ -- BEDEVERE: Stand by for attack!! [CUT TO enormous army forming up. Trebuchets, rows of PIKEMEN, siege towers, pennants flying, shouts of "Stand by for attack!" Traditional army build-up shots. The shouts echo across the ranks of the army. We see various groups reacting, and stirring themselves in readiness.] ARTHUR: Who are they? BEDEVERE: Oh, just some friends! "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///