0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.1122: Vim9: line continuation in dict member not recognized

Problem:    Vim9: line continuation in dict member not recognized.
Solution:   Check for line continuation.
This commit is contained in:
Bram Moolenaar
2020-07-03 21:09:52 +02:00
parent 743d062020
commit 442af2f89e
3 changed files with 59 additions and 3 deletions

View File

@@ -3362,7 +3362,7 @@ eval_index(
* *
* Get the (first) variable from inside the []. * Get the (first) variable from inside the [].
*/ */
*arg = skipwhite(*arg + 1); *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
if (**arg == ':') if (**arg == ':')
empty1 = TRUE; empty1 = TRUE;
else if (eval1(arg, &var1, evalarg) == FAIL) // recursive! else if (eval1(arg, &var1, evalarg) == FAIL) // recursive!
@@ -3377,10 +3377,11 @@ eval_index(
/* /*
* Get the second variable from inside the [:]. * Get the second variable from inside the [:].
*/ */
*arg = skipwhite_and_linebreak(*arg, evalarg);
if (**arg == ':') if (**arg == ':')
{ {
range = TRUE; range = TRUE;
*arg = skipwhite(*arg + 1); *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
if (**arg == ']') if (**arg == ']')
empty2 = TRUE; empty2 = TRUE;
else if (eval1(arg, &var2, evalarg) == FAIL) // recursive! else if (eval1(arg, &var2, evalarg) == FAIL) // recursive!
@@ -3400,6 +3401,7 @@ eval_index(
} }
// Check for the ']'. // Check for the ']'.
*arg = skipwhite_and_linebreak(*arg, evalarg);
if (**arg != ']') if (**arg != ']')
{ {
if (verbose) if (verbose)
@@ -5043,6 +5045,21 @@ handle_subscript(
&& (evalarg->eval_flags & EVAL_EVALUATE); && (evalarg->eval_flags & EVAL_EVALUATE);
int ret = OK; int ret = OK;
dict_T *selfdict = NULL; 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 // "." is ".name" lookup when we found a dict or when evaluating and
// scriptversion is at least 2, where string concatenation is "..". // scriptversion is at least 2, where string concatenation is "..".
@@ -5054,7 +5071,7 @@ handle_subscript(
&& current_sctx.sc_version >= 2))) && current_sctx.sc_version >= 2)))
|| (**arg == '(' && (!evaluate || rettv->v_type == VAR_FUNC || (**arg == '(' && (!evaluate || rettv->v_type == VAR_FUNC
|| rettv->v_type == VAR_PARTIAL))) || rettv->v_type == VAR_PARTIAL)))
&& !VIM_ISWHITE(*(*arg - 1))) && (!check_white || !VIM_ISWHITE(*(*arg - 1))))
|| (**arg == '-' && (*arg)[1] == '>'))) || (**arg == '-' && (*arg)[1] == '>')))
{ {
if (**arg == '(') if (**arg == '(')

View File

@@ -1138,6 +1138,43 @@ def Test_expr_member()
call CheckDefExecFailure(["let d: dict<number>", "d = g:list_empty"], 'E1029: Expected dict but got list') call CheckDefExecFailure(["let d: dict<number>", "d = g:list_empty"], 'E1029: Expected dict but got list')
enddef 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() def Test_expr7_option()
" option " option
set ts=11 set ts=11

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1122,
/**/ /**/
1121, 1121,
/**/ /**/