# HG changeset patch # User Bram Moolenaar # Date 1594411204 -7200 # Node ID 4edc60c9c0aa6d1d629195c3e574b42ac227d5e7 # Parent 5e3dec30405807f9d472d51a0e47a5bfb898e6a4 patch 8.2.1175: Vim9: cannot split a line before ".member" Commit: https://github.com/vim/vim/commit/a7eedf317a806fceec1ddd8f9bebed6e00be0ed2 Author: Bram Moolenaar Date: Fri Jul 10 21:50:41 2020 +0200 patch 8.2.1175: Vim9: cannot split a line before ".member" Problem: Vim9: Cannot split a line before ".member". Solution: Check for ".member" after line break. 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 @@ -1016,7 +1016,8 @@ def Test_expr7_list() call CheckDefFailure(["let x = g:list_mixed[xxx]"], 'E1001:') call CheckDefFailure(["let x = [1,2,3]"], 'E1069:') call CheckDefExecFailure(["let x = g:list_mixed['xx']"], 'E39:') - call CheckDefFailure(["let x = g:list_mixed[0"], 'E111:') + call CheckDefFailure(["let x = g:list_mixed["], 'E1097:') + call CheckDefFailure(["let x = g:list_mixed[0"], 'E1097:') call CheckDefExecFailure(["let x = g:list_empty[3]"], 'E684:') enddef @@ -1135,6 +1136,11 @@ def Test_expr_member() assert_equal(1, g:dict_one.one) let d: dict = g:dict_one assert_equal(1, d['one']) + assert_equal(1, d[ + 'one' + ]) + assert_equal(1, d + .one) # getting the one member should clear the dict after getting the item assert_equal('one', #{one: 'one'}.one) 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 */ /**/ + 1175, +/**/ 1174, /**/ 1173, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -2501,6 +2501,21 @@ may_get_next_line(char_u *whitep, char_u return OK; } +/* + * Idem, and give an error when failed. + */ + static int +may_get_next_line_error(char_u *whitep, char_u **arg, cctx_T *cctx) +{ + if (may_get_next_line(whitep, arg, cctx) == FAIL) + { + emsg(_("E1097: line incomplete")); + return FAIL; + } + return OK; +} + + // Structure passed between the compile_expr* functions to keep track of // constants that have been parsed but for which no code was produced yet. If // possible expressions on these constants are applied at compile time. If @@ -3588,8 +3603,11 @@ compile_subscript( // If a following line starts with "->{" or "->X" advance to that // line, so that a line break before "->" is allowed. - if (next != NULL && next[0] == '-' && next[1] == '>' - && (next[2] == '{' || ASCII_ISALPHA(next[2]))) + // Also if a following line starts with ".x". + if (next != NULL && + ((next[0] == '-' && next[1] == '>' + && (next[2] == '{' || ASCII_ISALPHA(next[2]))) + || (next[0] == '.' && ASCII_ISALPHA(next[1])))) { next = next_line_from_context(cctx, TRUE); if (next == NULL) @@ -3672,11 +3690,13 @@ compile_subscript( ++p; *arg = skipwhite(p); - if (may_get_next_line(p, arg, cctx) == FAIL) + if (may_get_next_line_error(p, arg, cctx) == FAIL) return FAIL; if (compile_expr0(arg, cctx) == FAIL) return FAIL; + if (may_get_next_line_error(p, arg, cctx) == FAIL) + return FAIL; if (**arg != ']') { emsg(_(e_missbrac));