diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-07-03 21:09:52 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-07-03 21:09:52 +0200 |
commit | 442af2f89e29fb60790bffde2def9cd74a081780 (patch) | |
tree | 6d9291f650a047156a561b33cfd0bcdb93397699 | |
parent | 743d0620203388bf87dc611cea544b485e4b9f85 (diff) | |
download | vim-git-442af2f89e29fb60790bffde2def9cd74a081780.tar.gz |
patch 8.2.1122: Vim9: line continuation in dict member not recognizedv8.2.1122
Problem: Vim9: line continuation in dict member not recognized.
Solution: Check for line continuation.
-rw-r--r-- | src/eval.c | 23 | ||||
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 37 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 59 insertions, 3 deletions
diff --git a/src/eval.c b/src/eval.c index 9a2fdf654..c569710ab 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3362,7 +3362,7 @@ eval_index( * * Get the (first) variable from inside the []. */ - *arg = skipwhite(*arg + 1); + *arg = skipwhite_and_linebreak(*arg + 1, evalarg); if (**arg == ':') empty1 = TRUE; else if (eval1(arg, &var1, evalarg) == FAIL) // recursive! @@ -3377,10 +3377,11 @@ eval_index( /* * Get the second variable from inside the [:]. */ + *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg == ':') { range = TRUE; - *arg = skipwhite(*arg + 1); + *arg = skipwhite_and_linebreak(*arg + 1, evalarg); if (**arg == ']') empty2 = TRUE; else if (eval1(arg, &var2, evalarg) == FAIL) // recursive! @@ -3400,6 +3401,7 @@ eval_index( } // Check for the ']'. + *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg != ']') { if (verbose) @@ -5043,6 +5045,21 @@ handle_subscript( && (evalarg->eval_flags & EVAL_EVALUATE); int ret = OK; dict_T *selfdict = NULL; + int check_white = TRUE; + + // When at the end of the line and ".name" follows in the next line then + // consume the line break. Only when rettv is a dict. + if (rettv->v_type == VAR_DICT) + { + int getnext; + char_u *p = eval_next_non_blank(*arg, evalarg, &getnext); + + if (getnext && *p == '.' && ASCII_ISALPHA(p[1])) + { + *arg = eval_next_line(evalarg); + check_white = FALSE; + } + } // "." is ".name" lookup when we found a dict or when evaluating and // scriptversion is at least 2, where string concatenation is "..". @@ -5054,7 +5071,7 @@ handle_subscript( && current_sctx.sc_version >= 2))) || (**arg == '(' && (!evaluate || rettv->v_type == VAR_FUNC || rettv->v_type == VAR_PARTIAL))) - && !VIM_ISWHITE(*(*arg - 1))) + && (!check_white || !VIM_ISWHITE(*(*arg - 1)))) || (**arg == '-' && (*arg)[1] == '>'))) { if (**arg == '(') diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index ff662b957..a604de2b0 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1138,6 +1138,43 @@ def Test_expr_member() call CheckDefExecFailure(["let d: dict<number>", "d = g:list_empty"], 'E1029: Expected dict but got list') enddef +def Test_expr_member_vim9script() + let lines =<< trim END + vim9script + let d = #{one: + 'one', + two: 'two'} + assert_equal('one', d.one) + assert_equal('one', d + .one) + assert_equal('one', d[ + 'one' + ]) + END + CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + let l = [1, + 2, + 3, 4 + ] + assert_equal(2, l[ + 1 + ]) + assert_equal([2, 3], l[1 : 2]) + assert_equal([1, 2, 3], l[ + : + 2 + ]) + assert_equal([3, 4], l[ + 2 + : + ]) + END + CheckScriptSuccess(lines) +enddef + def Test_expr7_option() " option set ts=11 diff --git a/src/version.c b/src/version.c index de98479ad..00aca2b1e 100644 --- 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 */ /**/ + 1122, +/**/ 1121, /**/ 1120, |