To: vim_dev@googlegroups.com Subject: Patch 8.2.1504 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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, 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 -- Bram@Moolenaar.net -- 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 ///