# HG changeset patch # User Bram Moolenaar # Date 1586716204 -7200 # Node ID 628011800942cd9e1cf6436626465868a1639ce0 # Parent 7fa29447bc18f9a6ca419fa07b178273be9c33f9 patch 8.2.0561: Vim9: cannot split function call in multiple lines Commit: https://github.com/vim/vim/commit/e6085c53506e38d07334faa1002ee90b1933b128 Author: Bram Moolenaar Date: Sun Apr 12 20:19:16 2020 +0200 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 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -184,6 +184,19 @@ example, when a list spans multiple line '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 --- 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 --- 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 --- 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 * { 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 * 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 *expect } /* - * 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 '['. */