]> granicus.if.org Git - vim/commitdiff
patch 8.2.4869: expression in command block does not look after NL v8.2.4869
authorBram Moolenaar <Bram@vim.org>
Thu, 5 May 2022 11:20:28 +0000 (12:20 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 5 May 2022 11:20:28 +0000 (12:20 +0100)
Problem:    Expression in command block does not look after NL.
Solution:   Skip over NL to check what follows. (closes #10358)

src/eval.c
src/proto/eval.pro
src/testdir/test_usercommands.vim
src/version.c
src/vim9script.c

index e2980a283e0b832f612e37a456f30be47ba790b6..0c6d2e5ac1e29cae6f85ac8f39deec6994fcd929 100644 (file)
@@ -1803,7 +1803,7 @@ skip_for_lines(void *fi_void, evalarg_T *evalarg)
     int                i;
 
     for (i = 0; i < fi->fi_break_count; ++i)
-       eval_next_line(evalarg);
+       eval_next_line(NULL, evalarg);
 }
 
 /*
@@ -2153,7 +2153,7 @@ getline_peek_skip_comments(evalarg_T *evalarg)
        p = skipwhite(next);
        if (*p != NUL && !vim9_comment_start(p))
            return next;
-       if (eval_next_line(evalarg) == NULL)
+       if (eval_next_line(NULL, evalarg) == NULL)
            break;
     }
     return NULL;
@@ -2176,11 +2176,14 @@ eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext)
     if (in_vim9script()
            && evalarg != NULL
            && (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL)
-           && (*p == NUL || (vim9_comment_start(p) && VIM_ISWHITE(p[-1]))))
+           && (*p == NUL || *p == NL
+                            || (vim9_comment_start(p) && VIM_ISWHITE(p[-1]))))
     {
        char_u *next;
 
-       if (evalarg->eval_cookie != NULL)
+       if (*p == NL)
+           next = p + 1;
+       else if (evalarg->eval_cookie != NULL)
            next = getline_peek_skip_comments(evalarg);
        else
            next = peek_next_line_from_context(evalarg->eval_cctx);
@@ -2199,11 +2202,14 @@ eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext)
  * Only called for Vim9 script.
  */
     char_u *
-eval_next_line(evalarg_T *evalarg)
+eval_next_line(char_u *arg, evalarg_T *evalarg)
 {
     garray_T   *gap = &evalarg->eval_ga;
     char_u     *line;
 
+    if (arg != NULL && *arg == NL)
+       return skipwhite(arg + 1);
+
     if (evalarg->eval_cookie != NULL)
        line = evalarg->eval_getline(0, evalarg->eval_cookie, 0,
                                                           GETLINE_CONCAT_ALL);
@@ -2253,7 +2259,7 @@ skipwhite_and_linebreak(char_u *arg, evalarg_T *evalarg)
        return skipwhite(arg);
     eval_next_non_blank(p, evalarg, &getnext);
     if (getnext)
-       return eval_next_line(evalarg);
+       return eval_next_line(arg, evalarg);
     return p;
 }
 
@@ -2449,7 +2455,7 @@ eval1(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
        evaluate = evalarg_used->eval_flags & EVAL_EVALUATE;
 
        if (getnext)
-           *arg = eval_next_line(evalarg_used);
+           *arg = eval_next_line(*arg, evalarg_used);
        else
        {
            if (evaluate && vim9script && !VIM_ISWHITE(p[-1]))
@@ -2515,7 +2521,7 @@ eval1(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
                return FAIL;
            }
            if (getnext)
-               *arg = eval_next_line(evalarg_used);
+               *arg = eval_next_line(*arg, evalarg_used);
            else
            {
                if (evaluate && vim9script && !VIM_ISWHITE(p[-1]))
@@ -2621,7 +2627,7 @@ eval2(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
        while (p[0] == '|' && p[1] == '|')
        {
            if (getnext)
-               *arg = eval_next_line(evalarg_used);
+               *arg = eval_next_line(*arg, evalarg_used);
            else
            {
                if (evaluate && vim9script && !VIM_ISWHITE(p[-1]))
@@ -2747,7 +2753,7 @@ eval3(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
        while (p[0] == '&' && p[1] == '&')
        {
            if (getnext)
-               *arg = eval_next_line(evalarg_used);
+               *arg = eval_next_line(*arg, evalarg_used);
            else
            {
                if (evaluate && vim9script && !VIM_ISWHITE(p[-1]))
@@ -2864,7 +2870,7 @@ eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
 
        if (getnext)
        {
-           *arg = eval_next_line(evalarg);
+           *arg = eval_next_line(*arg, evalarg);
            p = *arg;
        }
        else if (evaluate && vim9script && !VIM_ISWHITE(**arg))
@@ -3026,7 +3032,7 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
        evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
        oplen = (concat && p[1] == '.') ? 2 : 1;
        if (getnext)
-           *arg = eval_next_line(evalarg);
+           *arg = eval_next_line(*arg, evalarg);
        else
        {
            if (evaluate && vim9script && !VIM_ISWHITE(**arg))
@@ -3258,7 +3264,7 @@ eval6(
 
        evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
        if (getnext)
-           *arg = eval_next_line(evalarg);
+           *arg = eval_next_line(*arg, evalarg);
        else
        {
            if (evaluate && in_vim9script() && !VIM_ISWHITE(**arg))
@@ -6150,7 +6156,7 @@ handle_subscript(
                        || ASCII_ISALPHA(in_vim9script() ? *skipwhite(p + 2)
                                                                    : p[2])))))
        {
-           *arg = eval_next_line(evalarg);
+           *arg = eval_next_line(*arg, evalarg);
            p = *arg;
            check_white = FALSE;
        }
index 49dc65b8a89db20cf8aefb3ec76e497da75b7612..e6cd8928d19c18a6f106588b1ddd3631a6c4446e 100644 (file)
@@ -32,7 +32,7 @@ void free_for_info(void *fi_void);
 void set_context_for_expression(expand_T *xp, char_u *arg, cmdidx_T cmdidx);
 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 *eval_next_line(char_u *arg, evalarg_T *evalarg);
 char_u *skipwhite_and_linebreak(char_u *arg, evalarg_T *evalarg);
 void init_evalarg(evalarg_T *evalarg);
 void clear_evalarg(evalarg_T *evalarg, exarg_T *eap);
index 2feeef03f97a9c48e1a337ffb52f6b24bc376119..8c588c55e3c1a795de5f6e8363aca9969254de36 100644 (file)
@@ -694,6 +694,20 @@ func Test_usercmd_with_block()
   call v9.CheckScriptSuccess(lines)
   delcommand HelloThere
 
+  let lines =<< trim END
+      command EchoCond {
+          const test: string = true
+              ? 'true'
+              : 'false'
+          g:result = test
+      }
+      EchoCond
+  END
+  call v9.CheckScriptSuccess(lines)
+  call assert_equal('true', g:result)
+  delcommand EchoCond
+  unlet g:result
+
   let lines =<< trim END
       command BadCommand {
          echo  {
index ca9fae212dd10946de6193ceebdd01ee25fc763f..1237ebf71ae676885450d91ac6029dc72bdeb548 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4869,
 /**/
     4868,
 /**/
index b1bfe634cb7ef69d7bea6c6928a54419630b857f..6595882f722683cd88139a70e8e8eefef9fa4b9a 100644 (file)
@@ -589,7 +589,7 @@ handle_import(
        char_u *p;
 
        if (getnext)
-           arg = eval_next_line(evalarg);
+           arg = eval_next_line(expr_end, evalarg);
        else
            arg = nextarg;