# HG changeset patch # User Bram Moolenaar # Date 1608751804 -3600 # Node ID 7951c5098e8e462376989075234ab98d6ff01465 # Parent e0a6d49ed3ad80241a7aa30bfa2aacc7599abfe0 patch 8.2.2200: Vim9: lambda without white space around -> is confusing Commit: https://github.com/vim/vim/commit/27bf7af9d042b396c412fcad7bac59849a4a420f Author: Bram Moolenaar Date: Wed Dec 23 20:27:31 2020 +0100 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 https://github.com/vim/vim/issues/7503) diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim --- 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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2200, +/**/ 2199, /**/ 2198, diff --git a/src/vim9compile.c b/src/vim9compile.c --- 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);