summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-04-12 20:19:16 +0200
committerBram Moolenaar <Bram@vim.org>2020-04-12 20:19:16 +0200
commite6085c53506e38d07334faa1002ee90b1933b128 (patch)
treec9bb45883c6ac69a7ff2a02606190aa7d42634be
parent2196bce56fcd56b0eaece50c079bac99f5bc31af (diff)
patch 8.2.0561: Vim9: cannot split function call in multiple linesv8.2.0561
Problem: Vim9: cannot split function call in multiple lines. Solution: Find more arguments in following lines.
-rw-r--r--runtime/doc/vim9.txt13
-rw-r--r--src/testdir/test_vim9_script.vim37
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c70
4 files changed, 75 insertions, 47 deletions
diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt
index b7b05b4974..c7286ecdf5 100644
--- a/runtime/doc/vim9.txt
+++ b/runtime/doc/vim9.txt
@@ -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 ~
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 358d4e876d..da7c473ef7 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -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.
diff --git a/src/version.c b/src/version.c
index 3ef50fb7e2..5bfc36ab9e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 561,
+/**/
560,
/**/
559,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 6abf95cc42..201b7b0983 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -2049,6 +2049,27 @@ free_imported(cctx_T *cctx)
}
/*
+ * 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:".
* Also finds imported variables.
@@ -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;
}
/*
@@ -2535,27 +2564,6 @@ need_type(type_T *actual, type_T *expected, int offset, cctx_T *cctx)
}
/*
- * 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 '['.
*/