diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-04-12 20:19:16 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-04-12 20:19:16 +0200 |
commit | e6085c53506e38d07334faa1002ee90b1933b128 (patch) | |
tree | c9bb45883c6ac69a7ff2a02606190aa7d42634be | |
parent | 2196bce56fcd56b0eaece50c079bac99f5bc31af (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.txt | 13 | ||||
-rw-r--r-- | src/testdir/test_vim9_script.vim | 37 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 70 |
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 '['. */ |