]> granicus.if.org Git - vim/commitdiff
patch 8.2.1122: Vim9: line continuation in dict member not recognized v8.2.1122
authorBram Moolenaar <Bram@vim.org>
Fri, 3 Jul 2020 19:09:52 +0000 (21:09 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 3 Jul 2020 19:09:52 +0000 (21:09 +0200)
Problem:    Vim9: line continuation in dict member not recognized.
Solution:   Check for line continuation.

src/eval.c
src/testdir/test_vim9_expr.vim
src/version.c

index 9a2fdf65403dc922822939fd06b0781397c24844..c569710ab5579edbde9b21cf26bf6eb9b16be7b5 100644 (file)
@@ -3362,7 +3362,7 @@ eval_index(
         *
         * Get the (first) variable from inside the [].
         */
-       *arg = skipwhite(*arg + 1);
+       *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
        if (**arg == ':')
            empty1 = TRUE;
        else if (eval1(arg, &var1, evalarg) == FAIL)    // recursive!
@@ -3377,10 +3377,11 @@ eval_index(
        /*
         * Get the second variable from inside the [:].
         */
+       *arg = skipwhite_and_linebreak(*arg, evalarg);
        if (**arg == ':')
        {
            range = TRUE;
-           *arg = skipwhite(*arg + 1);
+           *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
            if (**arg == ']')
                empty2 = TRUE;
            else if (eval1(arg, &var2, evalarg) == FAIL)        // recursive!
@@ -3400,6 +3401,7 @@ eval_index(
        }
 
        // Check for the ']'.
+       *arg = skipwhite_and_linebreak(*arg, evalarg);
        if (**arg != ']')
        {
            if (verbose)
@@ -5043,6 +5045,21 @@ handle_subscript(
                                      && (evalarg->eval_flags & EVAL_EVALUATE);
     int                ret = OK;
     dict_T     *selfdict = NULL;
+    int                check_white = TRUE;
+
+    // When at the end of the line and ".name" follows in the next line then
+    // consume the line break.  Only when rettv is a dict.
+    if (rettv->v_type == VAR_DICT)
+    {
+       int     getnext;
+       char_u  *p = eval_next_non_blank(*arg, evalarg, &getnext);
+
+       if (getnext && *p == '.' && ASCII_ISALPHA(p[1]))
+       {
+           *arg = eval_next_line(evalarg);
+           check_white = FALSE;
+       }
+    }
 
     // "." is ".name" lookup when we found a dict or when evaluating and
     // scriptversion is at least 2, where string concatenation is "..".
@@ -5054,7 +5071,7 @@ handle_subscript(
                            && current_sctx.sc_version >= 2)))
                    || (**arg == '(' && (!evaluate || rettv->v_type == VAR_FUNC
                                            || rettv->v_type == VAR_PARTIAL)))
-               && !VIM_ISWHITE(*(*arg - 1)))
+               && (!check_white || !VIM_ISWHITE(*(*arg - 1))))
            || (**arg == '-' && (*arg)[1] == '>')))
     {
        if (**arg == '(')
index ff662b9578c046d1471d6d2229b2805df18d92d2..a604de2b0b06c6ac244d9291b288117cda0f2507 100644 (file)
@@ -1138,6 +1138,43 @@ def Test_expr_member()
   call CheckDefExecFailure(["let d: dict<number>", "d = g:list_empty"], 'E1029: Expected dict but got list')
 enddef
 
+def Test_expr_member_vim9script()
+  let lines =<< trim END
+      vim9script
+      let d = #{one:
+               'one',
+               two: 'two'}
+      assert_equal('one', d.one)
+      assert_equal('one', d
+                            .one)
+      assert_equal('one', d[
+                           'one'
+                           ])
+  END
+  CheckScriptSuccess(lines)
+
+  lines =<< trim END
+      vim9script
+      let l = [1,
+                 2,
+                 3, 4
+                 ]
+      assert_equal(2, l[
+                           1
+                           ])
+      assert_equal([2, 3], l[1 : 2])
+      assert_equal([1, 2, 3], l[
+                               :
+                               2
+                               ])
+      assert_equal([3, 4], l[
+                               2
+                               :
+                               ])
+  END
+  CheckScriptSuccess(lines)
+enddef
+
 def Test_expr7_option()
   " option
   set ts=11
index de98479adb477cd64898168bc6a9e42da563c973..00aca2b1e4b9959dbc4a05e059e005567a0a8cdf 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1122,
 /**/
     1121,
 /**/