Patch 8.2.2620
Problem:    Vim9: Using #{ for a dictionary gives strange errors.
Solution:   Give an error when using #{ for a comment after a command.
Files:      src/vim9compile.c, src/vim9script.c, src/proto/vim9script.pro,
            src/errors.h, src/testdir/test_vim9_expr.vim,
            src/testdir/test_vim9_script.vim


*** ../vim-8.2.2619/src/vim9compile.c   2021-03-17 20:56:33.649085754 +0100
--- src/vim9compile.c   2021-03-18 21:28:15.669791847 +0100
***************
*** 1546,1552 ****
      isn->isn_arg.funcref.fr_func = ufunc->uf_dfunc_idx;
      cctx->ctx_has_closure = 1;
  
!     // if the referenced function is a closure, it may use items further up in
      // the nested context, including this one.
      if (ufunc->uf_flags & FC_CLOSURE)
        cctx->ctx_ufunc->uf_flags |= FC_CLOSURE;
--- 1546,1552 ----
      isn->isn_arg.funcref.fr_func = ufunc->uf_dfunc_idx;
      cctx->ctx_has_closure = 1;
  
!     // If the referenced function is a closure, it may use items further up in
      // the nested context, including this one.
      if (ufunc->uf_flags & FC_CLOSURE)
        cctx->ctx_ufunc->uf_flags |= FC_CLOSURE;
***************
*** 2401,2406 ****
--- 2401,2408 ----
        if (line != NULL)
        {
            p = skipwhite(line);
+           if (vim9_bad_comment(p))
+               return NULL;
            if (*p != NUL && !vim9_comment_start(p))
                return p;
        }
***************
*** 2465,2470 ****
--- 2467,2474 ----
  may_get_next_line(char_u *whitep, char_u **arg, cctx_T *cctx)
  {
      *arg = skipwhite(whitep);
+     if (vim9_bad_comment(*arg))
+       return FAIL;
      if (**arg == NUL || (VIM_ISWHITE(*whitep) && vim9_comment_start(*arg)))
      {
        char_u *next = next_line_from_context(cctx, TRUE);
***************
*** 4277,4286 ****
  
        if (!eval_isnamec1(**arg))
        {
!           if (ends_excmd(*skipwhite(*arg)))
!               semsg(_(e_empty_expression_str), *arg);
!           else
!               semsg(_(e_name_expected_str), *arg);
            return FAIL;
        }
  
--- 4281,4293 ----
  
        if (!eval_isnamec1(**arg))
        {
!           if (!vim9_bad_comment(*arg))
!           {
!               if (ends_excmd(*skipwhite(*arg)))
!                   semsg(_(e_empty_expression_str), *arg);
!               else
!                   semsg(_(e_name_expected_str), *arg);
!           }
            return FAIL;
        }
  
***************
*** 8297,8302 ****
--- 8304,8311 ----
            semsg(_(e_trailing_arg), line);
            goto erret;
        }
+       else if (line != NULL && vim9_bad_comment(skipwhite(line)))
+           goto erret;
        else
        {
            line = next_line_from_context(&cctx, FALSE);
*** ../vim-8.2.2619/src/vim9script.c    2021-03-13 21:07:17.742458250 +0100
--- src/vim9script.c    2021-03-18 21:15:12.356378094 +0100
***************
*** 113,124 ****
  }
  
  /*
!  * Return TRUE if "p" points at a "#".  Does not check for white space.
   */
      int
  vim9_comment_start(char_u *p)
  {
!     return p[0] == '#';
  }
  
  #if defined(FEAT_EVAL) || defined(PROTO)
--- 113,141 ----
  }
  
  /*
!  * Give an error message if "p" points at "#{" and return TRUE.
!  * This avoids that using a legacy style #{} dictionary leads to difficult to
!  * understand errors.
!  */
!     int
! vim9_bad_comment(char_u *p)
! {
!     if (p[0] == '#' && p[1] == '{')
!     {
!       emsg(_(e_cannot_use_hash_curly_to_start_comment));
!       return TRUE;
!     }
!     return FALSE;
! }
! 
! /*
!  * Return TRUE if "p" points at a "#" not followed by '{'.
!  * Does not check for white space.
   */
      int
  vim9_comment_start(char_u *p)
  {
!     return p[0] == '#' && p[1] != '{';
  }
  
  #if defined(FEAT_EVAL) || defined(PROTO)
*** ../vim-8.2.2619/src/proto/vim9script.pro    2021-03-13 20:57:15.859515065 
+0100
--- src/proto/vim9script.pro    2021-03-18 20:59:24.863583856 +0100
***************
*** 2,7 ****
--- 2,8 ----
  int in_vim9script(void);
  void ex_vim9script(exarg_T *eap);
  int not_in_vim9(exarg_T *eap);
+ int vim9_bad_comment(char_u *p);
  int vim9_comment_start(char_u *p);
  void ex_export(exarg_T *eap);
  void free_imports_and_script_vars(int sid);
*** ../vim-8.2.2619/src/errors.h        2021-03-13 20:57:15.859515065 +0100
--- src/errors.h        2021-03-18 20:58:38.311747367 +0100
***************
*** 375,377 ****
--- 375,379 ----
        INIT(= N_("E1168: Argument already declared in the script: %s"));
  EXTERN char e_import_as_name_not_supported_here[]
        INIT(= N_("E1169: 'import * as {name}' not supported here"));
+ EXTERN char e_cannot_use_hash_curly_to_start_comment[]
+       INIT(= N_("E1170: 'Cannot use #{ to start a comment"));
*** ../vim-8.2.2619/src/testdir/test_vim9_expr.vim      2021-03-14 
18:38:50.016676652 +0100
--- src/testdir/test_vim9_expr.vim      2021-03-18 21:29:00.577644048 +0100
***************
*** 2159,2166 ****
    CheckDefAndScriptSuccess(lines)
   
    # legacy syntax doesn't work
!   CheckDefFailure(["var x = #{key: 8}"], 'E1097:', 3)
!   CheckDefFailure(["var x = 'a' .. #{a: 1}"], 'E1097:', 3)
  
    CheckDefFailure(["var x = {a:8}"], 'E1069:', 1)
    CheckDefFailure(["var x = {a : 8}"], 'E1068:', 1)
--- 2159,2168 ----
    CheckDefAndScriptSuccess(lines)
   
    # legacy syntax doesn't work
!   CheckDefFailure(["var x = #{key: 8}"], 'E1170:', 1)
!   CheckDefFailure(["var x = 'a' #{a: 1}"], 'E1170:', 1)
!   CheckDefFailure(["var x = 'a' .. #{a: 1}"], 'E1170:', 1)
!   CheckDefFailure(["var x = true ? #{a: 1}"], 'E1170:', 1)
  
    CheckDefFailure(["var x = {a:8}"], 'E1069:', 1)
    CheckDefFailure(["var x = {a : 8}"], 'E1068:', 1)
*** ../vim-8.2.2619/src/testdir/test_vim9_script.vim    2021-03-17 
17:45:55.353935904 +0100
--- src/testdir/test_vim9_script.vim    2021-03-18 21:30:27.821357022 +0100
***************
*** 2452,2458 ****
    assert_equal('1_3_', result)
  
    var s = ''
!   while s == 'x' #{comment}
    endwhile
  enddef
  
--- 2452,2458 ----
    assert_equal('1_3_', result)
  
    var s = ''
!   while s == 'x' # {comment}
    endwhile
  enddef
  
*** ../vim-8.2.2619/src/version.c       2021-03-17 21:29:25.497532653 +0100
--- src/version.c       2021-03-18 21:36:35.436148202 +0100
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     2620,
  /**/

-- 
I learned the customs and mannerisms of engineers by observing them, much the
way Jane Goodall learned about the great apes, but without the hassle of
grooming.
                                (Scott Adams - The Dilbert principle)

 /// 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/202103182038.12IKcTIr1346275%40masaka.moolenaar.net.

Raspunde prin e-mail lui