forked from aniani/vim
patch 8.2.1891: Vim9: skipping over expression doesn't handle line breaks
Problem: Vim9: skipping over expression doesn't handle line breaks. Solution: Pass evalarg to skip_expr(). (closes #7157)
This commit is contained in:
@@ -368,12 +368,12 @@ eval_to_string_skip(
|
|||||||
* Return FAIL for an error, OK otherwise.
|
* Return FAIL for an error, OK otherwise.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
skip_expr(char_u **pp)
|
skip_expr(char_u **pp, evalarg_T *evalarg)
|
||||||
{
|
{
|
||||||
typval_T rettv;
|
typval_T rettv;
|
||||||
|
|
||||||
*pp = skipwhite(*pp);
|
*pp = skipwhite(*pp);
|
||||||
return eval1(pp, &rettv, NULL);
|
return eval1(pp, &rettv, evalarg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -640,7 +640,7 @@ do_cmdline(
|
|||||||
struct dbg_stuff debug_saved; // saved things for debug mode
|
struct dbg_stuff debug_saved; // saved things for debug mode
|
||||||
int initial_trylevel;
|
int initial_trylevel;
|
||||||
msglist_T **saved_msg_list = NULL;
|
msglist_T **saved_msg_list = NULL;
|
||||||
msglist_T *private_msg_list;
|
msglist_T *private_msg_list = NULL;
|
||||||
|
|
||||||
// "fgetline" and "cookie" passed to do_one_cmd()
|
// "fgetline" and "cookie" passed to do_one_cmd()
|
||||||
char_u *(*cmd_getline)(int, void *, int, getline_opt_T);
|
char_u *(*cmd_getline)(int, void *, int, getline_opt_T);
|
||||||
@@ -664,7 +664,6 @@ do_cmdline(
|
|||||||
// BufWritePost autocommands are executed after a write error.
|
// BufWritePost autocommands are executed after a write error.
|
||||||
saved_msg_list = msg_list;
|
saved_msg_list = msg_list;
|
||||||
msg_list = &private_msg_list;
|
msg_list = &private_msg_list;
|
||||||
private_msg_list = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// It's possible to create an endless loop with ":execute", catch that
|
// It's possible to create an endless loop with ":execute", catch that
|
||||||
@@ -3256,7 +3255,7 @@ find_ex_command(
|
|||||||
|
|
||||||
// When followed by "=" or "+=" then it is an assignment.
|
// When followed by "=" or "+=" then it is an assignment.
|
||||||
++emsg_silent;
|
++emsg_silent;
|
||||||
if (skip_expr(&after) == OK
|
if (skip_expr(&after, NULL) == OK
|
||||||
&& (*after == '='
|
&& (*after == '='
|
||||||
|| (*after != NUL && after[1] == '=')))
|
|| (*after != NUL && after[1] == '=')))
|
||||||
eap->cmdidx = CMD_var;
|
eap->cmdidx = CMD_var;
|
||||||
@@ -4391,7 +4390,7 @@ expand_filename(
|
|||||||
if (p[0] == '`' && p[1] == '=')
|
if (p[0] == '`' && p[1] == '=')
|
||||||
{
|
{
|
||||||
p += 2;
|
p += 2;
|
||||||
(void)skip_expr(&p);
|
(void)skip_expr(&p, NULL);
|
||||||
if (*p == '`')
|
if (*p == '`')
|
||||||
++p;
|
++p;
|
||||||
continue;
|
continue;
|
||||||
@@ -4666,7 +4665,7 @@ separate_nextcmd(exarg_T *eap)
|
|||||||
else if (p[0] == '`' && p[1] == '=' && (eap->argt & EX_XFILE))
|
else if (p[0] == '`' && p[1] == '=' && (eap->argt & EX_XFILE))
|
||||||
{
|
{
|
||||||
p += 2;
|
p += 2;
|
||||||
(void)skip_expr(&p);
|
(void)skip_expr(&p, NULL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -1329,7 +1329,7 @@ expand_env_esc(
|
|||||||
|
|
||||||
var = src;
|
var = src;
|
||||||
src += 2;
|
src += 2;
|
||||||
(void)skip_expr(&src);
|
(void)skip_expr(&src, NULL);
|
||||||
if (*src == '`')
|
if (*src == '`')
|
||||||
++src;
|
++src;
|
||||||
len = src - var;
|
len = src - var;
|
||||||
|
@@ -9,7 +9,7 @@ int eval_expr_valid_arg(typval_T *tv);
|
|||||||
int eval_expr_typval(typval_T *expr, typval_T *argv, int argc, typval_T *rettv);
|
int eval_expr_typval(typval_T *expr, typval_T *argv, int argc, typval_T *rettv);
|
||||||
int eval_expr_to_bool(typval_T *expr, int *error);
|
int eval_expr_to_bool(typval_T *expr, int *error);
|
||||||
char_u *eval_to_string_skip(char_u *arg, exarg_T *eap, int skip);
|
char_u *eval_to_string_skip(char_u *arg, exarg_T *eap, int skip);
|
||||||
int skip_expr(char_u **pp);
|
int skip_expr(char_u **pp, evalarg_T *evalarg);
|
||||||
int skip_expr_concatenate(char_u **arg, char_u **start, char_u **end, evalarg_T *evalarg);
|
int skip_expr_concatenate(char_u **arg, char_u **start, char_u **end, evalarg_T *evalarg);
|
||||||
char_u *eval_to_string(char_u *arg, int convert);
|
char_u *eval_to_string(char_u *arg, int convert);
|
||||||
char_u *eval_to_string_safe(char_u *arg, int use_sandbox);
|
char_u *eval_to_string_safe(char_u *arg, int use_sandbox);
|
||||||
|
@@ -242,6 +242,13 @@ def Test_method_call_linebreak()
|
|||||||
CheckScriptSuccess(lines)
|
CheckScriptSuccess(lines)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def Test_skipped_expr_linebreak()
|
||||||
|
if 0
|
||||||
|
var x = []
|
||||||
|
->map({ -> 0})
|
||||||
|
endif
|
||||||
|
enddef
|
||||||
|
|
||||||
def Test_dict_member()
|
def Test_dict_member()
|
||||||
var test: dict<list<number>> = {'data': [3, 1, 2]}
|
var test: dict<list<number>> = {'data': [3, 1, 2]}
|
||||||
test.data->sort()
|
test.data->sort()
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1891,
|
||||||
/**/
|
/**/
|
||||||
1890,
|
1890,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -4385,7 +4385,11 @@ compile_expr1(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
|
|||||||
// Ignore all kinds of errors when not producing code.
|
// Ignore all kinds of errors when not producing code.
|
||||||
if (cctx->ctx_skip == SKIP_YES)
|
if (cctx->ctx_skip == SKIP_YES)
|
||||||
{
|
{
|
||||||
skip_expr(arg);
|
evalarg_T evalarg;
|
||||||
|
|
||||||
|
CLEAR_FIELD(evalarg);
|
||||||
|
evalarg.eval_cctx = cctx;
|
||||||
|
skip_expr(arg, &evalarg);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user