Patch 8.2.1504

9 views
Skip to first unread message

Bram Moolenaar

unread,
Aug 21, 2020, 4:38:11 PM8/21/20
to vim...@googlegroups.com

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 -- Br...@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 ///
Reply all
Reply to author
Forward
0 new messages