Patch 8.2.2288
Problem:    Vim9: line break and comment not always skipped.
Solution:   Skip over white space and then line break more consistently.
            (closes #7610)
Files:      src/vim9compile.c, src/testdir/test_vim9_expr.vim


*** ../vim-8.2.2287/src/vim9compile.c   2021-01-02 19:44:50.702794031 +0100
--- src/vim9compile.c   2021-01-03 18:29:47.360855537 +0100
***************
*** 2256,2261 ****
--- 2256,2262 ----
  }
  
  /*
+  * Skip over white space at "whitep" and assign to "*arg".
   * If "*arg" is at the end of the line, advance to the next line.
   * Also when "whitep" points to white space and "*arg" is on a "#".
   * Return FAIL if beyond the last line, "*arg" is unmodified then.
***************
*** 2263,2268 ****
--- 2264,2270 ----
      static int
  may_get_next_line(char_u *whitep, char_u **arg, cctx_T *cctx)
  {
+     *arg = skipwhite(whitep);
      if (**arg == NUL || (VIM_ISWHITE(*whitep) && vim9_comment_start(*arg)))
      {
        char_u *next = next_line_from_context(cctx, TRUE);
***************
*** 3018,3031 ****
      int               count = 0;
      dict_T    *d = dict_alloc();
      dictitem_T        *item;
!     char_u    *whitep = *arg;
      char_u    *p;
      int               is_const;
      int               is_all_const = TRUE;    // reset when non-const 
encountered
  
      if (d == NULL)
        return FAIL;
-     *arg = skipwhite(*arg + 1);
      for (;;)
      {
        char_u      *key = NULL;
--- 3020,3032 ----
      int               count = 0;
      dict_T    *d = dict_alloc();
      dictitem_T        *item;
!     char_u    *whitep = *arg + 1;
      char_u    *p;
      int               is_const;
      int               is_all_const = TRUE;    // reset when non-const 
encountered
  
      if (d == NULL)
        return FAIL;
      for (;;)
      {
        char_u      *key = NULL;
***************
*** 3112,3118 ****
            return FAIL;
        }
  
-       *arg = skipwhite(*arg + 1);
        if (may_get_next_line(whitep, arg, cctx) == FAIL)
        {
            *arg = NULL;
--- 3113,3118 ----
***************
*** 3126,3132 ****
        ++count;
  
        whitep = *arg;
-       *arg = skipwhite(*arg);
        if (may_get_next_line(whitep, arg, cctx) == FAIL)
        {
            *arg = NULL;
--- 3126,3131 ----
***************
*** 3474,3480 ****
      static int
  compile_parenthesis(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
  {
!     int ret;
  
      *arg = skipwhite(*arg + 1);
      if (ppconst->pp_used <= PPSIZE - 10)
--- 3473,3479 ----
      static int
  compile_parenthesis(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
  {
!     int           ret;
  
      *arg = skipwhite(*arg + 1);
      if (ppconst->pp_used <= PPSIZE - 10)
***************
*** 3488,3494 ****
            return FAIL;
        ret = compile_expr0(arg, cctx);
      }
!     *arg = skipwhite(*arg);
      if (**arg == ')')
        ++*arg;
      else if (ret == OK)
--- 3487,3494 ----
            return FAIL;
        ret = compile_expr0(arg, cctx);
      }
!     if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
!       return FAIL;
      if (**arg == ')')
        ++*arg;
      else if (ret == OK)
***************
*** 3660,3666 ****
            ppconst->pp_is_const = FALSE;
  
            ++p;
-           *arg = skipwhite(p);
            if (may_get_next_line_error(p, arg, cctx) == FAIL)
                return FAIL;
            if (**arg == ':')
--- 3660,3665 ----
***************
*** 3678,3684 ****
                                                                    ":", *arg);
                    return FAIL;
                }
!               if (may_get_next_line_error(p, arg, cctx) == FAIL)
                    return FAIL;
                *arg = skipwhite(*arg);
            }
--- 3677,3683 ----
                                                                    ":", *arg);
                    return FAIL;
                }
!               if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
                    return FAIL;
                *arg = skipwhite(*arg);
            }
***************
*** 3692,3699 ****
                                                                    ":", *arg);
                    return FAIL;
                }
!               *arg = skipwhite(*arg);
!               if (may_get_next_line_error(p, arg, cctx) == FAIL)
                    return FAIL;
                if (**arg == ']')
                    // missing second index is equal to end of string
--- 3691,3697 ----
                                                                    ":", *arg);
                    return FAIL;
                }
!               if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
                    return FAIL;
                if (**arg == ']')
                    // missing second index is equal to end of string
***************
*** 3702,3708 ****
                {
                    if (compile_expr0(arg, cctx) == FAIL)
                        return FAIL;
!                   if (may_get_next_line_error(p, arg, cctx) == FAIL)
                        return FAIL;
                    *arg = skipwhite(*arg);
                }
--- 3700,3706 ----
                {
                    if (compile_expr0(arg, cctx) == FAIL)
                        return FAIL;
!                   if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
                        return FAIL;
                    *arg = skipwhite(*arg);
                }
***************
*** 4115,4121 ****
            return FAIL;
        }
        ++*arg;
!       if (may_get_next_line_error(*arg - 1, arg, cctx) == FAIL)
            return FAIL;
      }
  
--- 4113,4119 ----
            return FAIL;
        }
        ++*arg;
!       if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
            return FAIL;
      }
  
***************
*** 4174,4180 ****
            error_white_both(op, 1);
            return FAIL;
        }
-       *arg = skipwhite(op + 1);
        if (may_get_next_line_error(op + 1, arg, cctx) == FAIL)
            return FAIL;
  
--- 4172,4177 ----
***************
*** 4251,4257 ****
            return FAIL;
        }
  
-       *arg = skipwhite(op + oplen);
        if (may_get_next_line_error(op + oplen, arg, cctx) == FAIL)
            return FAIL;
  
--- 4248,4253 ----
***************
*** 4381,4387 ****
        }
  
        // get the second variable
-       *arg = skipwhite(p + len);
        if (may_get_next_line_error(p + len, arg, cctx) == FAIL)
            return FAIL;
  
--- 4377,4382 ----
***************
*** 4481,4487 ****
                                 ?  JUMP_IF_COND_TRUE : JUMP_IF_COND_FALSE, 0);
  
            // eval the next expression
-           *arg = skipwhite(p + 2);
            if (may_get_next_line_error(p + 2, arg, cctx) == FAIL)
            {
                ga_clear(&end_ga);
--- 4476,4481 ----
***************
*** 4674,4680 ****
        }
  
        // evaluate the second expression; any type is accepted
-       *arg = skipwhite(p + 1 + op_falsy);
        if (may_get_next_line_error(p + 1 + op_falsy, arg, cctx) == FAIL)
            return FAIL;
        if (compile_expr1(arg, cctx, ppconst) == FAIL)
--- 4668,4673 ----
***************
*** 4725,4731 ****
            if (has_const_expr)
                cctx->ctx_skip = save_skip == SKIP_YES || const_value
                                                         ? SKIP_YES : SKIP_NOT;
-           *arg = skipwhite(p + 1);
            if (may_get_next_line_error(p + 1, arg, cctx) == FAIL)
                return FAIL;
            if (compile_expr1(arg, cctx, ppconst) == FAIL)
--- 4718,4723 ----
***************
*** 5414,5420 ****
        // A line break may follow the "=".
  
        wp = op + oplen;
-       p = skipwhite(wp);
        if (may_get_next_line_error(wp, &p, cctx) == FAIL)
            return FAIL;
        if (compile_expr0(&p, cctx) == FAIL)
--- 5406,5411 ----
***************
*** 5766,5772 ****
                        --cctx->ctx_locals.ga_len;
                    instr_count = instr->ga_len;
                    wp = op + oplen;
-                   p = skipwhite(wp);
                    if (may_get_next_line_error(wp, &p, cctx) == FAIL)
                    {
                        if (new_local)
--- 5757,5762 ----
***************
*** 6575,6581 ****
  
      // consume "in"
      wp = p;
-     p = skipwhite(p);
      if (may_get_next_line_error(wp, &p, cctx) == FAIL)
        return NULL;
      if (STRNCMP(p, "in", 2) != 0 || !IS_WHITE_OR_NUL(p[2]))
--- 6565,6570 ----
***************
*** 6584,6590 ****
        return NULL;
      }
      wp = p + 2;
-     p = skipwhite(wp);
      if (may_get_next_line_error(wp, &p, cctx) == FAIL)
        return NULL;
  
--- 6573,6578 ----
*** ../vim-8.2.2287/src/testdir/test_vim9_expr.vim      2021-01-01 
19:17:52.297976777 +0100
--- src/testdir/test_vim9_expr.vim      2021-01-03 18:30:45.484727103 +0100
***************
*** 43,48 ****
--- 43,53 ----
        name = 0
        assert_equal('two', name ? 'one' : 'two')
  
+       echo ['a'] + (1 ? ['b'] : ['c']
+                 )
+       echo ['a'] + (1 ? ['b'] : ['c'] # comment
+                 )
+ 
        # with constant condition expression is not evaluated 
        assert_equal('one', 1 ? 'one' : xxx)
  
***************
*** 2084,2089 ****
--- 2089,2098 ----
        var d = {a: () => 3, b: () => 7}
        assert_equal(3, d.a())
        assert_equal(7, d.b())
+ 
+       var cd = { # comment
+                 key: 'val' # comment
+                }
    END
    CheckDefAndScriptSuccess(lines)
   
***************
*** 2665,2671 ****
  enddef
  
  func Test_expr7_fails()
!   call CheckDefFailure(["var x = (12"], "E110:", 1)
  
    call CheckDefFailure(["var x = -'xx'"], "E1030:", 1)
    call CheckDefFailure(["var x = +'xx'"], "E1030:", 1)
--- 2674,2680 ----
  enddef
  
  func Test_expr7_fails()
!   call CheckDefFailure(["var x = (12"], "E1097:", 3)
  
    call CheckDefFailure(["var x = -'xx'"], "E1030:", 1)
    call CheckDefFailure(["var x = +'xx'"], "E1030:", 1)
*** ../vim-8.2.2287/src/version.c       2021-01-03 17:39:24.438674804 +0100
--- src/version.c       2021-01-03 18:17:03.615260147 +0100
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     2288,
  /**/

-- 
>From "know your smileys":
 :-X    My lips are sealed

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202101031733.103HXdFX2189664%40masaka.moolenaar.net.

Raspunde prin e-mail lui