]> granicus.if.org Git - vim/commitdiff
patch 8.2.0561: Vim9: cannot split function call in multiple lines v8.2.0561
authorBram Moolenaar <Bram@vim.org>
Sun, 12 Apr 2020 18:19:16 +0000 (20:19 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 12 Apr 2020 18:19:16 +0000 (20:19 +0200)
Problem:    Vim9: cannot split function call in multiple lines.
Solution:   Find more arguments in following lines.

runtime/doc/vim9.txt
src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index b7b05b4974d536870678c94ce4840d44ed3ebcce..c7286ecdf5eb2e395fcb26173bec2299547d8e67 100644 (file)
@@ -184,6 +184,19 @@ example, when a list spans multiple lines: >
                'one',
                'two',
                ]
+And when a dict spans multiple lines: >
+       let mydict = #{
+               one: 1,
+               two: 2,
+               }
+Function call: >
+       let result = Func(
+                       arg1,
+                       arg2
+                       )
+
+Note that "enddef" cannot be used at the start of a continuation line, it ends
+the current function.
 
 
 No curly braces expansion ~
index 358d4e876db0b888b5fac279eaa49e76bf442fa2..da7c473ef72a0e6aea8119328d0327445d008f70 100644 (file)
@@ -636,16 +636,16 @@ enddef
 
 def Test_import_absolute()
   let import_lines = [
-        'vim9script',
-        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
-        'def UseExported()',
-        '  g:imported_abs = exported',
-        '  exported = 8888',
-        '  g:imported_after = exported',
-        'enddef',
-        'UseExported()',
-        'g:import_disassembled = execute("disass UseExported")',
-        ]
+        'vim9script',
+        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
+        'def UseExported()',
+        '  g:imported_abs = exported',
+        '  exported = 8888',
+        '  g:imported_after = exported',
+        'enddef',
+        'UseExported()',
+        'g:import_disassembled = execute("disass UseExported")',
+        ]
   writefile(import_lines, 'Ximport_abs.vim')
   writefile(s:export_script_lines, 'Xexport_abs.vim')
 
@@ -661,8 +661,8 @@ def Test_import_absolute()
         \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
         \ .. 'g:imported_after = exported.*'
         \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
-        \ .. '5 STOREG g:imported_after.*'
-        \, g:import_disassembled)
+        \ .. '5 STOREG g:imported_after.*',
+        g:import_disassembled)
   unlet g:imported_abs
   unlet g:import_disassembled
 
@@ -672,10 +672,10 @@ enddef
 
 def Test_import_rtp()
   let import_lines = [
-        'vim9script',
-        'import exported from "Xexport_rtp.vim"',
-        'g:imported_rtp = exported',
-        ]
+        'vim9script',
+        'import exported from "Xexport_rtp.vim"',
+        'g:imported_rtp = exported',
+        ]
   writefile(import_lines, 'Ximport_rtp.vim')
   mkdir('import')
   writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
@@ -988,6 +988,11 @@ def Test_automatic_line_continuation()
       three: 3  " comment
       }
   assert_equal(#{one: 1, two: 2, three: 3}, mydict)
+
+  assert_equal(
+        ['one', 'two', 'three'],
+        split('one two three')
+        )
 enddef
 
 " Keep this last, it messes up highlighting.
index 3ef50fb7e23b6471fcef5548ed5e3dc664eff8fa..5bfc36ab9ea4c4b35cc67c7f95fc8e926e26620e 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    561,
 /**/
     560,
 /**/
index 6abf95cc429c7d8e896088d9ea00a9cde8515aee..201b7b0983f199785a2d3fda506c135e7c53a3c0 100644 (file)
@@ -2048,6 +2048,27 @@ free_imported(cctx_T *cctx)
     ga_clear(&cctx->ctx_imports);
 }
 
+/*
+ * Get the next line of the function from "cctx".
+ * Returns NULL when at the end.
+ */
+    static char_u *
+next_line_from_context(cctx_T *cctx)
+{
+    char_u     *line = NULL;
+
+    do
+    {
+       ++cctx->ctx_lnum;
+       if (cctx->ctx_lnum >= cctx->ctx_ufunc->uf_lines.ga_len)
+           break;
+       line = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[cctx->ctx_lnum];
+       SOURCING_LNUM = cctx->ctx_ufunc->uf_script_ctx.sc_lnum
+                                                         + cctx->ctx_lnum + 1;
+    } while (line == NULL);
+    return line;
+}
+
 /*
  * Generate an instruction to load script-local variable "name", without the
  * leading "s:".
@@ -2284,8 +2305,21 @@ compile_arguments(char_u **arg, cctx_T *cctx, int *argcount)
 {
     char_u *p = *arg;
 
-    while (*p != NUL && *p != ')')
+    for (;;)
     {
+       if (*p == NUL)
+       {
+           p = next_line_from_context(cctx);
+           if (p == NULL)
+               break;
+           p = skipwhite(p);
+       }
+       if (*p == ')')
+       {
+           *arg = p + 1;
+           return OK;
+       }
+
        if (compile_expr1(&p, cctx) == FAIL)
            return FAIL;
        ++*argcount;
@@ -2298,19 +2332,14 @@ compile_arguments(char_u **arg, cctx_T *cctx, int *argcount)
        if (*p == ',')
        {
            ++p;
-           if (!VIM_ISWHITE(*p))
+           if (*p != NUL && !VIM_ISWHITE(*p))
                semsg(_(e_white_after), ",");
        }
        p = skipwhite(p);
     }
-    p = skipwhite(p);
-    if (*p != ')')
-    {
-       emsg(_(e_missing_close));
-       return FAIL;
-    }
-    *arg = p + 1;
-    return OK;
+
+    emsg(_(e_missing_close));
+    return FAIL;
 }
 
 /*
@@ -2534,27 +2563,6 @@ need_type(type_T *actual, type_T *expected, int offset, cctx_T *cctx)
     return OK;
 }
 
-/*
- * Get the next line of the function from "cctx".
- * Returns NULL when at the end.
- */
-    static char_u *
-next_line_from_context(cctx_T *cctx)
-{
-    char_u     *line = NULL;
-
-    do
-    {
-       ++cctx->ctx_lnum;
-       if (cctx->ctx_lnum >= cctx->ctx_ufunc->uf_lines.ga_len)
-           break;
-       line = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[cctx->ctx_lnum];
-       SOURCING_LNUM = cctx->ctx_ufunc->uf_script_ctx.sc_lnum
-                                                         + cctx->ctx_lnum + 1;
-    } while (line == NULL);
-    return line;
-}
-
 /*
  * parse a list: [expr, expr]
  * "*arg" points to the '['.