From: Bram Moolenaar Date: Sun, 12 Apr 2020 18:19:16 +0000 (+0200) Subject: patch 8.2.0561: Vim9: cannot split function call in multiple lines X-Git-Tag: v8.2.0561 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e6085c53506e38d07334faa1002ee90b1933b128;p=vim patch 8.2.0561: Vim9: cannot split function call in multiple lines Problem: Vim9: cannot split function call in multiple lines. Solution: Find more arguments in following lines. --- diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index b7b05b497..c7286ecdf 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 358d4e876..da7c473ef 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 3ef50fb7e..5bfc36ab9 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 561, /**/ 560, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 6abf95cc4..201b7b098 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -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 '['.