]> granicus.if.org Git - vim/commitdiff
patch 8.2.1891: Vim9: skipping over expression doesn't handle line breaks v8.2.1891
authorBram Moolenaar <Bram@vim.org>
Thu, 22 Oct 2020 19:22:58 +0000 (21:22 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 22 Oct 2020 19:22:58 +0000 (21:22 +0200)
Problem:    Vim9: skipping over expression doesn't handle line breaks.
Solution:   Pass evalarg to skip_expr(). (closes #7157)

src/eval.c
src/ex_docmd.c
src/misc1.c
src/proto/eval.pro
src/testdir/test_vim9_cmd.vim
src/version.c
src/vim9compile.c

index bb402dee94d042b19ce2e8c88977b201b2fecfcc..6bc2b29d9c2f51b684671b70af70ad3694f7b282 100644 (file)
@@ -368,12 +368,12 @@ eval_to_string_skip(
  * Return FAIL for an error, OK otherwise.
  */
     int
-skip_expr(char_u **pp)
+skip_expr(char_u **pp, evalarg_T *evalarg)
 {
     typval_T   rettv;
 
     *pp = skipwhite(*pp);
-    return eval1(pp, &rettv, NULL);
+    return eval1(pp, &rettv, evalarg);
 }
 
 /*
index 1ccd38ec90bb8ac1210591101d99f9443b7aa84c..5c46411b94adfcaa6cb13375360044579f786566 100644 (file)
@@ -640,7 +640,7 @@ do_cmdline(
     struct dbg_stuff debug_saved;      // saved things for debug mode
     int                initial_trylevel;
     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()
     char_u     *(*cmd_getline)(int, void *, int, getline_opt_T);
@@ -664,7 +664,6 @@ do_cmdline(
     // BufWritePost autocommands are executed after a write error.
     saved_msg_list = msg_list;
     msg_list = &private_msg_list;
-    private_msg_list = NULL;
 #endif
 
     // 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.
                ++emsg_silent;
-               if (skip_expr(&after) == OK
+               if (skip_expr(&after, NULL) == OK
                                  && (*after == '='
                                      || (*after != NUL && after[1] == '=')))
                    eap->cmdidx = CMD_var;
@@ -4391,7 +4390,7 @@ expand_filename(
        if (p[0] == '`' && p[1] == '=')
        {
            p += 2;
-           (void)skip_expr(&p);
+           (void)skip_expr(&p, NULL);
            if (*p == '`')
                ++p;
            continue;
@@ -4666,7 +4665,7 @@ separate_nextcmd(exarg_T *eap)
        else if (p[0] == '`' && p[1] == '=' && (eap->argt & EX_XFILE))
        {
            p += 2;
-           (void)skip_expr(&p);
+           (void)skip_expr(&p, NULL);
        }
 #endif
 
index bab9e680a72580c3b41017e701a2bfdabb5dcda7..058e8602db41c8c6ab2ee98ee3c737e3ef2506b3 100644 (file)
@@ -1329,7 +1329,7 @@ expand_env_esc(
 
            var = src;
            src += 2;
-           (void)skip_expr(&src);
+           (void)skip_expr(&src, NULL);
            if (*src == '`')
                ++src;
            len = src - var;
index c32403fd0f90b34a25a1d7a0b50495574254d822..58ec79ce43a9cf5090a4efad7af8a92c2ee7f2f5 100644 (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_to_bool(typval_T *expr, int *error);
 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);
 char_u *eval_to_string(char_u *arg, int convert);
 char_u *eval_to_string_safe(char_u *arg, int use_sandbox);
index ad3454d8319bf30d3f9ea022523b0c00d10c968d..296aa55e6df80dab5128005087e993216c5ae958 100644 (file)
@@ -242,6 +242,13 @@ def Test_method_call_linebreak()
   CheckScriptSuccess(lines)
 enddef
 
+def Test_skipped_expr_linebreak()
+  if 0
+    var x = []
+               ->map({ -> 0})
+  endif
+enddef
+
 def Test_dict_member()
    var test: dict<list<number>> = {'data': [3, 1, 2]}
    test.data->sort()
index 2340ab8d1fd5ffd4827bf9b5e127b70ce4ee8083..4b27b16ec9daf1880e655b2d9c6e30216a1307cc 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1891,
 /**/
     1890,
 /**/
index 58f4db9b724fc333bc1d4b6ce6596f4ea54fe978..45c35b2e4b29659ab5646bd68b5c817956dfb549 100644 (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.
     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;
     }