From: Bram Moolenaar Date: Wed, 23 Dec 2020 19:27:31 +0000 (+0100) Subject: patch 8.2.2200: Vim9: lambda without white space around -> is confusing X-Git-Tag: v8.2.2200 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=27bf7af9d042b396c412fcad7bac59849a4a420f;p=thirdparty%2Fvim.git patch 8.2.2200: Vim9: lambda without white space around -> is confusing Problem: Vim9: lambda without white space around -> is confusing. Solution: Require white space in a :def funtion. (issue #7503) --- diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim index 7f88cfa0d3..c5b546a197 100644 --- a/src/testdir/test_vim9_disassemble.vim +++ b/src/testdir/test_vim9_disassemble.vim @@ -1541,10 +1541,10 @@ def Test_disassemble_compare() ['{a: 1} is aDict', 'COMPAREDICT is'], ['{a: 1} isnot aDict', 'COMPAREDICT isnot'], - ['{->33} == {->44}', 'COMPAREFUNC =='], - ['{->33} != {->44}', 'COMPAREFUNC !='], - ['{->33} is {->44}', 'COMPAREFUNC is'], - ['{->33} isnot {->44}', 'COMPAREFUNC isnot'], + ['{-> 33} == {-> 44}', 'COMPAREFUNC =='], + ['{-> 33} != {-> 44}', 'COMPAREFUNC !='], + ['{-> 33} is {-> 44}', 'COMPAREFUNC is'], + ['{-> 33} isnot {-> 44}', 'COMPAREFUNC isnot'], ['77 == g:xx', 'COMPAREANY =='], ['77 != g:xx', 'COMPAREANY !='], diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index f2c9200eea..31c8827801 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1863,6 +1863,10 @@ def Test_expr7_lambda() END CheckDefAndScriptSuccess(lines) + CheckDefFailure(["var Ref = {a->a + 1}"], 'E720:') + CheckDefFailure(["var Ref = {a-> a + 1}"], 'E720:') + CheckDefFailure(["var Ref = {a ->a + 1}"], 'E720:') + CheckDefFailure(["filter([1, 2], {k,v -> 1})"], 'E1069:', 1) # error is in first line of the lambda CheckDefFailure(["var L = {a -> a + b}"], 'E1001:', 0) @@ -2538,7 +2542,7 @@ func Test_expr7_fails() call CheckDefFailure(["'yes'->", "Echo()"], 'E488: Trailing characters: ->', 1) call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2) - call CheckDefExecFailure(["{a: 1->len()"], 'E451:', 1) + call CheckDefExecFailure(["{a: 1->len()"], 'E723:', 2) call CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2) endfunc diff --git a/src/version.c b/src/version.c index 0fadf6b930..e3fd6c1fe7 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2200, /**/ 2199, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index b3d591d236..7d653a7bd6 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -3915,14 +3915,19 @@ compile_expr7( * Dictionary: {'key': val, 'key': val} */ case '{': { - char_u *start = skipwhite(*arg + 1); - garray_T ga_arg; + char_u *start = skipwhite(*arg + 1); + char_u *after = start; + garray_T ga_arg; // Find out what comes after the arguments. - ret = get_function_args(&start, '-', NULL, + ret = get_function_args(&after, '-', NULL, &ga_arg, TRUE, NULL, NULL, TRUE, NULL, NULL); - if (ret != FAIL && *start == '>') + if (ret != FAIL && after[0] == '>' + && ((after > start + 2 + && VIM_ISWHITE(after[-2])) + || after == start + 1) + && IS_WHITE_OR_NUL(after[1])) ret = compile_lambda(arg, cctx); else ret = compile_dict(arg, cctx, ppconst);