# HG changeset patch # User Bram Moolenaar # Date 1593286204 -7200 # Node ID 0ca7e04d39e357f96ce36cdb1ccad1f02e87755f # Parent e834e0a2a43c01d9c08d3496aa249c30abf97a81 patch 8.2.1074: Vim9: no line break allowed after some operators Commit: https://github.com/vim/vim/commit/9215f01218b2ed2cfe49c1f43fcf342bd9ffdded Author: Bram Moolenaar Date: Sat Jun 27 21:18:00 2020 +0200 patch 8.2.1074: Vim9: no line break allowed after some operators 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. diff --git a/src/dict.c b/src/dict.c --- a/src/dict.c +++ b/src/dict.c @@ -805,7 +805,6 @@ eval_dict(char_u **arg, typval_T *rettv, 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}. @@ -831,10 +830,7 @@ eval_dict(char_u **arg, typval_T *rettv, 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); + *arg = skipwhite_and_linebreak(*arg + 1, evalarg); while (**arg != '}' && **arg != NUL) { if ((literal @@ -866,10 +862,7 @@ eval_dict(char_u **arg, typval_T *rettv, goto failret; } - *arg = skipwhite(*arg + 1); - eval_next_non_blank(*arg, evalarg, &getnext); - if (getnext) - *arg = eval_next_line(evalarg); + *arg = skipwhite_and_linebreak(*arg + 1, evalarg); if (eval1(arg, &tv, evalarg) == FAIL) // recursive! { if (evaluate) @@ -911,9 +904,7 @@ eval_dict(char_u **arg, typval_T *rettv, } // the "}" can be on the next line - eval_next_non_blank(*arg, evalarg, &getnext); - if (getnext) - *arg = eval_next_line(evalarg); + *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg == '}') break; if (!had_comma) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -1871,6 +1871,18 @@ eval_next_line(evalarg_T *evalarg) 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,7 +2010,7 @@ eval1(char_u **arg, typval_T *rettv, eva /* * Get the second variable. Recursive! */ - *arg = skipwhite(*arg + 1); + *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,7 +2033,7 @@ eval1(char_u **arg, typval_T *rettv, eva /* * Get the third variable. Recursive! */ - *arg = skipwhite(*arg + 1); + *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,7 +2115,7 @@ eval2(char_u **arg, typval_T *rettv, eva /* * Get the second variable. */ - *arg = skipwhite(*arg + 2); + *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,7 +2209,7 @@ eval3(char_u **arg, typval_T *rettv, eva /* * Get the second variable. */ - *arg = skipwhite(*arg + 2); + *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,7 +2340,7 @@ eval4(char_u **arg, typval_T *rettv, eva /* * Get the second variable. */ - *arg = skipwhite(p + len); + *arg = skipwhite_and_linebreak(p + len, evalarg); if (eval5(arg, &var2, evalarg) == FAIL) { clear_tv(rettv); @@ -2452,10 +2464,7 @@ eval5(char_u **arg, typval_T *rettv, eva */ 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); + *arg = skipwhite_and_linebreak(*arg + 1, evalarg); if (eval6(arg, &var2, evalarg, op == '.') == FAIL) { clear_tv(rettv); @@ -2893,18 +2902,10 @@ eval7( * nested expression: (expression). */ case '(': { - int getnext; - - *arg = skipwhite(*arg + 1); - eval_next_non_blank(*arg, evalarg, &getnext); - if (getnext) - *arg = eval_next_line(evalarg); - + *arg = skipwhite_and_linebreak(*arg + 1, evalarg); ret = eval1(arg, rettv, evalarg); // recursive! - eval_next_non_blank(*arg, evalarg, &getnext); - if (getnext) - *arg = eval_next_line(evalarg); + *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg == ')') ++*arg; else if (ret == OK) diff --git a/src/list.c b/src/list.c --- a/src/list.c +++ b/src/list.c @@ -1164,7 +1164,6 @@ get_list_tv(char_u **arg, typval_T *rett { int evaluate = evalarg == NULL ? FALSE : evalarg->eval_flags & EVAL_EVALUATE; - int getnext; list_T *l = NULL; typval_T tv; listitem_T *item; @@ -1178,10 +1177,7 @@ get_list_tv(char_u **arg, typval_T *rett return FAIL; } - *arg = skipwhite(*arg + 1); - eval_next_non_blank(*arg, evalarg, &getnext); - if (getnext) - *arg = eval_next_line(evalarg); + *arg = skipwhite_and_linebreak(*arg + 1, evalarg); while (**arg != ']' && **arg != NUL) { if (eval1(arg, &tv, evalarg) == FAIL) // recursive! @@ -1212,9 +1208,7 @@ get_list_tv(char_u **arg, typval_T *rett } // the "]" can be on the next line - eval_next_non_blank(*arg, evalarg, &getnext); - if (getnext) - *arg = eval_next_line(evalarg); + *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg == ']') break; diff --git a/src/proto/eval.pro b/src/proto/eval.pro --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -29,6 +29,7 @@ void set_context_for_expression(expand_T 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); diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -64,6 +64,15 @@ def Test_expr1_vimscript() 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,6 +144,15 @@ def Test_expr2_vimscript() 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,6 +216,15 @@ def Test_expr3_vimscript() 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() @@ -549,6 +576,14 @@ def Test_expr4_vimscript() lines =<< trim END vim9script + let var = 123 == + 123 + assert_equal(1, var) + END + CheckScriptSuccess(lines) + + lines =<< trim END + vim9script let list = [1, 2, 3] let var = list is list diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -402,17 +402,17 @@ get_lambda_tv(char_u **arg, typval_T *re partial_T *pt = NULL; int varargs; int ret; - char_u *start = skipwhite(*arg + 1); + char_u *start; 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. + start = skipwhite(*arg + 1); ret = get_function_args(&start, '-', NULL, NULL, NULL, NULL, TRUE, NULL, NULL); if (ret == FAIL || *start != '>') @@ -435,10 +435,7 @@ get_lambda_tv(char_u **arg, typval_T *re 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); + *arg = skipwhite_and_linebreak(*arg + 1, evalarg); s = *arg; ret = skip_expr_concatenate(&s, arg, evalarg); if (ret == FAIL) @@ -451,10 +448,7 @@ get_lambda_tv(char_u **arg, typval_T *re } e = *arg; - *arg = skipwhite(*arg); - eval_next_non_blank(*arg, evalarg, &getnext); - if (getnext) - *arg = eval_next_line(evalarg); + *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg != '}') { semsg(_("E451: Expected }: %s"), *arg); diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1074, +/**/ 1073, /**/ 1072,