1
0
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:
Bram Moolenaar
2020-10-22 21:22:58 +02:00
parent 081db1a66d
commit 683581eb49
7 changed files with 22 additions and 10 deletions

View File

@@ -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);
} }
/* /*

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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()

View File

@@ -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,
/**/ /**/

View File

@@ -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;
} }