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 7f88cfa..c5b546a 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -1541,10 +1541,10 @@
['{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 f2c9200..31c8827 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -1863,6 +1863,10 @@
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 @@
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 0fadf6b..e3fd6c1 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2200,
+/**/
2199,
/**/
2198,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index b3d591d..7d653a7 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3915,14 +3915,19 @@
* 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);