Patch 8.2.1504
Problem:    Vim9: white space checks are only done for a :def function.
Solution:   Also do checks at the script level.  Adjust the name of a few
            error messages.
Files:      src/userfunc.c, src/errors.h, src/dict.c, src/list.c,
            src/vim9compile.c, src/vim9script.c, src/vim9type.c,
            src/evalvars.c, src/testdir/test_vim9_expr.vim,
            src/testdir/vim9.vim

*** ../vim-8.2.1503/src/userfunc.c      2020-08-20 15:02:38.536534973 +0200
--- src/userfunc.c      2020-08-21 22:28:48.897242067 +0200
***************
*** 119,125 ****
            ++p;
            if (!VIM_ISWHITE(*p))
            {
!               semsg(_(e_white_space_required_after), ":");
                return arg;
            }
            type = skipwhite(p);
--- 119,125 ----
            ++p;
            if (!VIM_ISWHITE(*p))
            {
!               semsg(_(e_white_space_required_after_str), ":");
                return arg;
            }
            type = skipwhite(p);
***************
*** 276,282 ****
                if (!skip && in_vim9script()
                                      && !IS_WHITE_OR_NUL(*p) && *p != endchar)
                {
!                   semsg(_(e_white_space_required_after), ",");
                    goto err_ret;
                }
            }
--- 276,282 ----
                if (!skip && in_vim9script()
                                      && !IS_WHITE_OR_NUL(*p) && *p != endchar)
                {
!                   semsg(_(e_white_space_required_after_str), ",");
                    goto err_ret;
                }
            }
***************
*** 623,628 ****
--- 623,629 ----
      int               ret = OK;
      typval_T  argvars[MAX_FUNC_ARGS + 1];     // vars for arguments
      int               argcount = 0;           // number of arguments found
+     int               vim9script = in_vim9script();
  
      /*
       * Get the arguments.
***************
*** 644,653 ****
        ++argcount;
        // The comma should come right after the argument, but this wasn't
        // checked previously, thus only enforce it in Vim9 script.
!       if (!in_vim9script())
            argp = skipwhite(argp);
        if (*argp != ',')
            break;
      }
      argp = skipwhite_and_linebreak(argp, evalarg);
      if (*argp == ')')
--- 645,669 ----
        ++argcount;
        // The comma should come right after the argument, but this wasn't
        // checked previously, thus only enforce it in Vim9 script.
!       if (vim9script)
!       {
!           if (*argp != ',' && *skipwhite(argp) == ',')
!           {
!               semsg(_(e_no_white_space_allowed_before_str), ",");
!               ret = FAIL;
!               break;
!           }
!       }
!       else
            argp = skipwhite(argp);
        if (*argp != ',')
            break;
+       if (vim9script && !IS_WHITE_OR_NUL(argp[1]))
+       {
+           semsg(_(e_white_space_required_after_str), ",");
+           ret = FAIL;
+           break;
+       }
      }
      argp = skipwhite_and_linebreak(argp, evalarg);
      if (*argp == ')')
***************
*** 3275,3281 ****
                          || fp->uf_script_ctx.sc_seq == current_sctx.sc_seq)))
            {
                if (vim9script)
!                   emsg_funcname(e_name_already_defined, name);
                else
                    emsg_funcname(e_funcexts, name);
                goto erret;
--- 3291,3297 ----
                          || fp->uf_script_ctx.sc_seq == current_sctx.sc_seq)))
            {
                if (vim9script)
!                   emsg_funcname(e_name_already_defined_str, name);
                else
                    emsg_funcname(e_funcexts, name);
                goto erret;
*** ../vim-8.2.1503/src/errors.h        2020-08-16 17:33:29.517887810 +0200
--- src/errors.h        2020-08-21 22:27:24.041708203 +0200
***************
*** 33,39 ****
        INIT(= N_("E1002: Syntax error at %s"));
  EXTERN char e_missing_return_value[]
        INIT(= N_("E1003: Missing return value"));
! EXTERN char e_white_space_required_before_and_after[]
        INIT(= N_("E1004: white space required before and after '%s'"));
  EXTERN char e_too_many_argument_types[]
        INIT(= N_("E1005: Too many argument types"));
--- 33,39 ----
        INIT(= N_("E1002: Syntax error at %s"));
  EXTERN char e_missing_return_value[]
        INIT(= N_("E1003: Missing return value"));
! EXTERN char e_white_space_required_before_and_after_str[]
        INIT(= N_("E1004: white space required before and after '%s'"));
  EXTERN char e_too_many_argument_types[]
        INIT(= N_("E1005: Too many argument types"));
***************
*** 156,168 ****
        INIT(= N_("E1063: type mismatch for v: variable"));
  // E1064 unused
  // E1065 unused
! EXTERN char e_cannot_declare_a_register[]
        INIT(= N_("E1066: Cannot declare a register: %s"));
! EXTERN char e_separator_mismatch[]
        INIT(= N_("E1067: Separator mismatch: %s"));
! EXTERN char e_no_white_space_allowed_before[]
        INIT(= N_("E1068: No white space allowed before '%s'"));
! EXTERN char e_white_space_required_after[]
        INIT(= N_("E1069: white space required after '%s'"));
  EXTERN char e_missing_from[]
        INIT(= N_("E1070: Missing \"from\""));
--- 156,168 ----
        INIT(= N_("E1063: type mismatch for v: variable"));
  // E1064 unused
  // E1065 unused
! EXTERN char e_cannot_declare_a_register_str[]
        INIT(= N_("E1066: Cannot declare a register: %s"));
! EXTERN char e_separator_mismatch_str[]
        INIT(= N_("E1067: Separator mismatch: %s"));
! EXTERN char e_no_white_space_allowed_before_str[]
        INIT(= N_("E1068: No white space allowed before '%s'"));
! EXTERN char e_white_space_required_after_str[]
        INIT(= N_("E1069: white space required after '%s'"));
  EXTERN char e_missing_from[]
        INIT(= N_("E1070: Missing \"from\""));
***************
*** 170,176 ****
        INIT(= N_("E1071: Invalid string after \"from\""));
  EXTERN char e_cannot_compare_str_with_str[]
        INIT(= N_("E1072: Cannot compare %s with %s"));
! EXTERN char e_name_already_defined[]
        INIT(= N_("E1073: name already defined: %s"));
  EXTERN char e_no_white_space_allowed_after_dot[]
        INIT(= N_("E1074: no white space allowed after dot"));
--- 170,176 ----
        INIT(= N_("E1071: Invalid string after \"from\""));
  EXTERN char e_cannot_compare_str_with_str[]
        INIT(= N_("E1072: Cannot compare %s with %s"));
! EXTERN char e_name_already_defined_str[]
        INIT(= N_("E1073: name already defined: %s"));
  EXTERN char e_no_white_space_allowed_after_dot[]
        INIT(= N_("E1074: no white space allowed after dot"));
*** ../vim-8.2.1503/src/dict.c  2020-08-18 13:04:10.795215214 +0200
--- src/dict.c  2020-08-21 22:24:41.418622079 +0200
***************
*** 862,868 ****
            if (evaluate)
            {
                if (*skipwhite(*arg) == ':')
!                   semsg(_(e_no_white_space_allowed_before), ":");
                else
                    semsg(_(e_missing_dict_colon), *arg);
            }
--- 862,868 ----
            if (evaluate)
            {
                if (*skipwhite(*arg) == ':')
!                   semsg(_(e_no_white_space_allowed_before_str), ":");
                else
                    semsg(_(e_missing_dict_colon), *arg);
            }
***************
*** 881,887 ****
        }
        if (vim9script && (*arg)[1] != NUL && !VIM_ISWHITE((*arg)[1]))
        {
!           semsg(_(e_white_space_required_after), ":");
            clear_tv(&tvkey);
            goto failret;
        }
--- 881,887 ----
        }
        if (vim9script && (*arg)[1] != NUL && !VIM_ISWHITE((*arg)[1]))
        {
!           semsg(_(e_white_space_required_after_str), ":");
            clear_tv(&tvkey);
            goto failret;
        }
***************
*** 924,930 ****
        {
            if (vim9script && (*arg)[1] != NUL && !VIM_ISWHITE((*arg)[1]))
            {
!               semsg(_(e_white_space_required_after), ",");
                goto failret;
            }
            *arg = skipwhite(*arg + 1);
--- 924,930 ----
        {
            if (vim9script && (*arg)[1] != NUL && !VIM_ISWHITE((*arg)[1]))
            {
!               semsg(_(e_white_space_required_after_str), ",");
                goto failret;
            }
            *arg = skipwhite(*arg + 1);
***************
*** 939,945 ****
            if (evaluate)
            {
                if (**arg == ',')
!                   semsg(_(e_no_white_space_allowed_before), ",");
                else
                    semsg(_(e_missing_dict_comma), *arg);
            }
--- 939,945 ----
            if (evaluate)
            {
                if (**arg == ',')
!                   semsg(_(e_no_white_space_allowed_before_str), ",");
                else
                    semsg(_(e_missing_dict_comma), *arg);
            }
*** ../vim-8.2.1503/src/list.c  2020-08-16 17:33:29.517887810 +0200
--- src/list.c  2020-08-21 22:24:45.622598065 +0200
***************
*** 1259,1265 ****
        {
            if (vim9script && !IS_WHITE_OR_NUL((*arg)[1]))
            {
!               semsg(_(e_white_space_required_after), ",");
                goto failret;
            }
            *arg = skipwhite(*arg + 1);
--- 1259,1265 ----
        {
            if (vim9script && !IS_WHITE_OR_NUL((*arg)[1]))
            {
!               semsg(_(e_white_space_required_after_str), ",");
                goto failret;
            }
            *arg = skipwhite(*arg + 1);
***************
*** 1276,1282 ****
            if (do_error)
            {
                if (**arg == ',')
!                   semsg(_(e_no_white_space_allowed_before), ",");
                else
                    semsg(_("E696: Missing comma in List: %s"), *arg);
            }
--- 1276,1282 ----
            if (do_error)
            {
                if (**arg == ',')
!                   semsg(_(e_no_white_space_allowed_before_str), ",");
                else
                    semsg(_("E696: Missing comma in List: %s"), *arg);
            }
*** ../vim-8.2.1503/src/vim9compile.c   2020-08-21 20:43:13.197523686 +0200
--- src/vim9compile.c   2020-08-21 22:27:20.797726150 +0200
***************
*** 295,301 ****
            || find_func_even_dead(p, FALSE, cctx) != NULL)
      {
        p[len] = c;
!       semsg(_(e_name_already_defined), p);
        return FAIL;
      }
      p[len] = c;
--- 295,301 ----
            || find_func_even_dead(p, FALSE, cctx) != NULL)
      {
        p[len] = c;
!       semsg(_(e_name_already_defined_str), p);
        return FAIL;
      }
      p[len] = c;
***************
*** 2202,2215 ****
  
        if (*p != ',' && *skipwhite(p) == ',')
        {
!           semsg(_(e_no_white_space_allowed_before), ",");
            p = skipwhite(p);
        }
        if (*p == ',')
        {
            ++p;
            if (*p != NUL && !VIM_ISWHITE(*p))
!               semsg(_(e_white_space_required_after), ",");
        }
        whitep = p;
        p = skipwhite(p);
--- 2202,2215 ----
  
        if (*p != ',' && *skipwhite(p) == ',')
        {
!           semsg(_(e_no_white_space_allowed_before_str), ",");
            p = skipwhite(p);
        }
        if (*p == ',')
        {
            ++p;
            if (*p != NUL && !VIM_ISWHITE(*p))
!               semsg(_(e_white_space_required_after_str), ",");
        }
        whitep = p;
        p = skipwhite(p);
***************
*** 2416,2422 ****
        }
        if (*p == ',')
        {
!           semsg(_(e_no_white_space_allowed_before), ",");
            return FAIL;
        }
        if (*p == ']')
--- 2416,2422 ----
        }
        if (*p == ',')
        {
!           semsg(_(e_no_white_space_allowed_before_str), ",");
            return FAIL;
        }
        if (*p == ']')
***************
*** 2432,2438 ****
            ++p;
            if (*p != ']' && !IS_WHITE_OR_NUL(*p))
            {
!               semsg(_(e_white_space_required_after), ",");
                return FAIL;
            }
        }
--- 2432,2438 ----
            ++p;
            if (*p != ']' && !IS_WHITE_OR_NUL(*p))
            {
!               semsg(_(e_white_space_required_after_str), ",");
                return FAIL;
            }
        }
***************
*** 2618,2624 ****
        if (**arg != ':')
        {
            if (*skipwhite(*arg) == ':')
!               semsg(_(e_no_white_space_allowed_before), ":");
            else
                semsg(_(e_missing_dict_colon), *arg);
            return FAIL;
--- 2618,2624 ----
        if (**arg != ':')
        {
            if (*skipwhite(*arg) == ':')
!               semsg(_(e_no_white_space_allowed_before_str), ":");
            else
                semsg(_(e_missing_dict_colon), *arg);
            return FAIL;
***************
*** 2626,2632 ****
        whitep = *arg + 1;
        if (!IS_WHITE_OR_NUL(*whitep))
        {
!           semsg(_(e_white_space_required_after), ":");
            return FAIL;
        }
  
--- 2626,2632 ----
        whitep = *arg + 1;
        if (!IS_WHITE_OR_NUL(*whitep))
        {
!           semsg(_(e_white_space_required_after_str), ":");
            return FAIL;
        }
  
***************
*** 2657,2663 ****
        }
        if (IS_WHITE_OR_NUL(*whitep))
        {
!           semsg(_(e_no_white_space_allowed_before), ",");
            return FAIL;
        }
        whitep = *arg + 1;
--- 2657,2663 ----
        }
        if (IS_WHITE_OR_NUL(*whitep))
        {
!           semsg(_(e_no_white_space_allowed_before_str), ",");
            return FAIL;
        }
        whitep = *arg + 1;
***************
*** 3518,3524 ****
      char_u    buf[10];
  
      vim_strncpy(buf, op, len);
!     semsg(_(e_white_space_required_before_and_after), buf);
  }
  
  /*
--- 3518,3524 ----
      char_u    buf[10];
  
      vim_strncpy(buf, op, len);
!     semsg(_(e_white_space_required_before_and_after_str), buf);
  }
  
  /*
***************
*** 3542,3548 ****
        if (**arg != '>')
        {
            if (*skipwhite(*arg) == '>')
!               semsg(_(e_no_white_space_allowed_before), ">");
            else
                emsg(_(e_missing_gt));
            return FAIL;
--- 3542,3548 ----
        if (**arg != '>')
        {
            if (*skipwhite(*arg) == '>')
!               semsg(_(e_no_white_space_allowed_before_str), ">");
            else
                emsg(_(e_missing_gt));
            return FAIL;
***************
*** 3887,3893 ****
  
            if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[2]))
            {
!               semsg(_(e_white_space_required_before_and_after), op);
                return FAIL;
            }
  
--- 3887,3893 ----
  
            if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[2]))
            {
!               semsg(_(e_white_space_required_before_and_after_str), op);
                return FAIL;
            }
  
***************
*** 4028,4034 ****
  
        if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[1]))
        {
!           semsg(_(e_white_space_required_before_and_after), "?");
            return FAIL;
        }
  
--- 4028,4034 ----
  
        if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[1]))
        {
!           semsg(_(e_white_space_required_before_and_after_str), "?");
            return FAIL;
        }
  
***************
*** 4087,4093 ****
  
        if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[1]))
        {
!           semsg(_(e_white_space_required_before_and_after), ":");
            return FAIL;
        }
  
--- 4087,4093 ----
  
        if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[1]))
        {
!           semsg(_(e_white_space_required_before_and_after_str), ":");
            return FAIL;
        }
  
***************
*** 4394,4400 ****
                  return;
        case '&': semsg(_(e_cannot_declare_an_option), name);
                  return;
!       case '@': semsg(_(e_cannot_declare_a_register), name);
                  return;
        default: return;
      }
--- 4394,4400 ----
                  return;
        case '&': semsg(_(e_cannot_declare_an_option), name);
                  return;
!       case '@': semsg(_(e_cannot_declare_a_register_str), name);
                  return;
        default: return;
      }
***************
*** 4775,4781 ****
                // parse optional type: "let var: type = expr"
                if (!VIM_ISWHITE(p[1]))
                {
!                   semsg(_(e_white_space_required_after), ":");
                    goto theend;
                }
                p = skipwhite(p + 1);
--- 4775,4781 ----
                // parse optional type: "let var: type = expr"
                if (!VIM_ISWHITE(p[1]))
                {
!                   semsg(_(e_white_space_required_after_str), ":");
                    goto theend;
                }
                p = skipwhite(p + 1);
***************
*** 6042,6048 ****
        end = skip_regexp_ex(p + 1, *p, TRUE, &tofree, &dropped);
        if (*end != *p)
        {
!           semsg(_(e_separator_mismatch), p);
            vim_free(tofree);
            return FAIL;
        }
--- 6042,6048 ----
        end = skip_regexp_ex(p + 1, *p, TRUE, &tofree, &dropped);
        if (*end != *p)
        {
!           semsg(_(e_separator_mismatch_str), p);
            vim_free(tofree);
            return FAIL;
        }
*** ../vim-8.2.1503/src/vim9script.c    2020-08-21 21:55:39.339649975 +0200
--- src/vim9script.c    2020-08-21 22:23:57.290875578 +0200
***************
*** 532,538 ****
      }
      if (!VIM_ISWHITE(p[1]))
      {
!       semsg(_(e_white_space_required_after), ":");
        return arg + STRLEN(arg);
      }
      name = vim_strnsave(arg, p - arg);
--- 532,538 ----
      }
      if (!VIM_ISWHITE(p[1]))
      {
!       semsg(_(e_white_space_required_after_str), ":");
        return arg + STRLEN(arg);
      }
      name = vim_strnsave(arg, p - arg);
*** ../vim-8.2.1503/src/vim9type.c      2020-08-15 16:33:24.497747330 +0200
--- src/vim9type.c      2020-08-21 22:25:08.482467864 +0200
***************
*** 471,477 ****
      if (**arg != '<')
      {
        if (*skipwhite(*arg) == '<')
!           semsg(_(e_no_white_space_allowed_before), "<");
        else
            emsg(_(e_missing_type));
        return type;
--- 471,477 ----
      if (**arg != '<')
      {
        if (*skipwhite(*arg) == '<')
!           semsg(_(e_no_white_space_allowed_before_str), "<");
        else
            emsg(_(e_missing_type));
        return type;
***************
*** 600,606 ****
  
                        if (*p != ',' && *skipwhite(p) == ',')
                        {
!                           semsg(_(e_no_white_space_allowed_before), ",");
                            return &t_any;
                        }
                        if (*p == ',')
--- 600,606 ----
  
                        if (*p != ',' && *skipwhite(p) == ',')
                        {
!                           semsg(_(e_no_white_space_allowed_before_str), ",");
                            return &t_any;
                        }
                        if (*p == ',')
***************
*** 608,614 ****
                            ++p;
                            if (!VIM_ISWHITE(*p))
                            {
!                               semsg(_(e_white_space_required_after), ",");
                                return &t_any;
                            }
                        }
--- 608,614 ----
                            ++p;
                            if (!VIM_ISWHITE(*p))
                            {
!                               semsg(_(e_white_space_required_after_str), ",");
                                return &t_any;
                            }
                        }
***************
*** 633,639 ****
                    // parse return type
                    ++*arg;
                    if (!VIM_ISWHITE(**arg))
!                       semsg(_(e_white_space_required_after), ":");
                    *arg = skipwhite(*arg);
                    ret_type = parse_type(arg, type_gap);
                }
--- 633,639 ----
                    // parse return type
                    ++*arg;
                    if (!VIM_ISWHITE(**arg))
!                       semsg(_(e_white_space_required_after_str), ":");
                    *arg = skipwhite(*arg);
                    ret_type = parse_type(arg, type_gap);
                }
*** ../vim-8.2.1503/src/evalvars.c      2020-08-21 21:32:45.502762790 +0200
--- src/evalvars.c      2020-08-21 22:27:03.273823307 +0200
***************
*** 811,817 ****
                                                   || !IS_WHITE_OR_NUL(*expr)))
            {
                vim_strncpy(op, expr - len, len);
!               semsg(_(e_white_space_required_before_and_after), op);
                i = FAIL;
            }
  
--- 811,817 ----
                                                   || !IS_WHITE_OR_NUL(*expr)))
            {
                vim_strncpy(op, expr - len, len);
!               semsg(_(e_white_space_required_before_and_after_str), op);
                i = FAIL;
            }
  
*** ../vim-8.2.1503/src/testdir/test_vim9_expr.vim      2020-08-21 
21:32:45.502762790 +0200
--- src/testdir/test_vim9_expr.vim      2020-08-21 22:18:12.756849748 +0200
***************
*** 2336,2342 ****
    call CheckDefFailure(["let x = '1'isnot2"], 'E488:', 1)
  
    call CheckDefFailure(["CallMe ('yes')"], 'E476:', 1)
!   call CheckDefFailure(["CallMe2('yes','no')"], 'E1069:', 1)
    call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:', 1)
  
    call CheckDefFailure(["v:nosuch += 3"], 'E1001:', 1)
--- 2336,2343 ----
    call CheckDefFailure(["let x = '1'isnot2"], 'E488:', 1)
  
    call CheckDefFailure(["CallMe ('yes')"], 'E476:', 1)
!   call CheckScriptFailure(["CallMe ('yes')"], 'E492:', 1)
!   call CheckScriptAndDefFailure(["CallMe2('yes','no')"], 'E1069:', 1)
    call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:', 1)
  
    call CheckDefFailure(["v:nosuch += 3"], 'E1001:', 1)
*** ../vim-8.2.1503/src/testdir/vim9.vim        2020-08-18 20:34:09.014182209 
+0200
--- src/testdir/vim9.vim        2020-08-21 22:30:26.780711535 +0200
***************
*** 40,42 ****
--- 40,49 ----
    so Xdef
    delete('Xdef')
  enddef
+ 
+ " Check that a command fails both when used in a :def function and when used
+ " in Vim9 script.
+ def CheckScriptAndDefFailure(lines: list<string>, error: string, lnum = -3)
+   CheckDefFailure(lines, error, lnum)
+   CheckScriptFailure(['vim9script'] + lines, error, lnum + 1)
+ enddef
*** ../vim-8.2.1503/src/version.c       2020-08-21 21:55:39.339649975 +0200
--- src/version.c       2020-08-21 22:15:36.813617307 +0200
***************
*** 756,757 ****
--- 756,759 ----
  {   /* Add new patch number below this line */
+ /**/
+     1504,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
260. Co-workers have to E-mail you about the fire alarm to get
     you out of the building.

 /// 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/202008212038.07LKc0rA552524%40masaka.moolenaar.net.

Raspunde prin e-mail lui