# HG changeset patch # User Bram Moolenaar # Date 1595511906 -7200 # Node ID 8cc1555f2445c4c92db913c6de4c93f7d25a2ae6 # Parent c50b04b76bc26913a2004dcc1a8bc2ef7a1c681b patch 8.2.1278: Vim9: line break after "->" only allowed in :def function Commit: https://github.com/vim/vim/commit/dd1a9af00f6954b176c5875af0a91acde72572c8 Author: Bram Moolenaar Date: Thu Jul 23 15:38:03 2020 +0200 patch 8.2.1278: Vim9: line break after "->" only allowed in :def function Problem: Vim9: line break after "->" only allowed in :def function. Solution: Only allow line break after "->". (closes https://github.com/vim/vim/issues/6492) diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -1730,6 +1730,7 @@ EXTERN char e_longname[] INIT(= N_("E75: EXTERN char e_toomsbra[] INIT(= N_("E76: Too many [")); EXTERN char e_toomany[] INIT(= N_("E77: Too many file names")); EXTERN char e_trailing[] INIT(= N_("E488: Trailing characters")); +EXTERN char e_trailing_arg[] INIT(= N_("E488: Trailing characters: %s")); EXTERN char e_umark[] INIT(= N_("E78: Unknown mark")); EXTERN char e_wildexpand[] INIT(= N_("E79: Cannot expand wildcards")); EXTERN char e_winheight[] INIT(= N_("E591: 'winheight' cannot be smaller than 'winminheight'")); diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1460,7 +1460,8 @@ enddef def Test_expr7_call() assert_equal('yes', 'yes'->Echo()) - assert_equal('yes', 'yes'->s:EchoArg()) + assert_equal('yes', 'yes' + ->s:EchoArg()) assert_equal(1, !range(5)->empty()) assert_equal([0, 1, 2], --3->range()) @@ -1531,6 +1532,8 @@ func Test_expr7_fails() call CheckDefFailure(["let x = ''", "let y = x.memb"], 'E715:') + call CheckDefFailure(["'yes'->", "Echo()"], 'E488:') + call CheckDefExecFailure(["[1, 2->len()"], 'E697:') call CheckDefExecFailure(["#{a: 1->len()"], 'E488:') call CheckDefExecFailure(["{'a': 1->len()"], 'E723:') @@ -1591,8 +1594,8 @@ enddef def Test_expr7_subscript_linebreak() let range = range( 3) - let l = range-> - map('string(v:key)') + let l = range + ->map('string(v:key)') assert_equal(['0', '1', '2'], l) l = range diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1278, +/**/ 1277, /**/ 1276, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -3773,8 +3773,7 @@ compile_subscript( p += 2; *arg = skipwhite(p); - if (may_get_next_line(p, arg, cctx) == FAIL) - return FAIL; + // No line break supported right after "->". if (**arg == '{') { // lambda call: list->{lambda} @@ -3785,6 +3784,11 @@ compile_subscript( { // method call: list->method() p = *arg; + if (!eval_isnamec1(*p)) + { + semsg(_(e_trailing_arg), p); + return FAIL; + } if (ASCII_ISALPHA(*p) && p[1] == ':') p += 2; for ( ; eval_isnamec1(*p); ++p) @@ -7045,7 +7049,7 @@ compile_def_function(ufunc_T *ufunc, int && !(*line == '#' && (line == cctx.ctx_line_start || VIM_ISWHITE(line[-1])))) { - semsg(_("E488: Trailing characters: %s"), line); + semsg(_(e_trailing_arg), line); goto erret; } else