comparison src/testdir/test_vim9_func.vim @ 23428:5807e3958e38 v8.2.2257

patch 8.2.2257: Vim9: using -> for lambda is ambiguous Commit: https://github.com/vim/vim/commit/2949cfdbe4335b9abcfeda1be4dfc52090ee1df6 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Dec 31 21:28:47 2020 +0100 patch 8.2.2257: Vim9: using -> for lambda is ambiguous Problem: Vim9: using -> for lambda is ambiguous. Solution: Stop supporting ->, must use =>.
author Bram Moolenaar <Bram@vim.org>
date Thu, 31 Dec 2020 21:30:03 +0100
parents c3c690c8fcbf
children f00d6ff51046
comparison
equal deleted inserted replaced
23427:8f2dcc0cfcf6 23428:5807e3958e38
52 def CallRecursive(n: number): number 52 def CallRecursive(n: number): number
53 return CallRecursive(n + 1) 53 return CallRecursive(n + 1)
54 enddef 54 enddef
55 55
56 def CallMapRecursive(l: list<number>): number 56 def CallMapRecursive(l: list<number>): number
57 return map(l, {_, v -> CallMapRecursive([v])})[0] 57 return map(l, (_, v) => CallMapRecursive([v]))[0]
58 enddef 58 enddef
59 59
60 def Test_funcdepth_error() 60 def Test_funcdepth_error()
61 set maxfuncdepth=10 61 set maxfuncdepth=10
62 62
308 308
309 lines =<< trim END 309 lines =<< trim END
310 vim9script 310 vim9script
311 def Outer() 311 def Outer()
312 def g:Inner() 312 def g:Inner()
313 echo map([1, 2, 3], {_, v -> v + 1}) 313 echo map([1, 2, 3], (_, v) => v + 1)
314 enddef 314 enddef
315 g:Inner() 315 g:Inner()
316 enddef 316 enddef
317 Outer() 317 Outer()
318 END 318 END
507 CheckScriptFailure(head + ["funcMap['func']('str', 123)"] + tail, 'E119:') 507 CheckScriptFailure(head + ["funcMap['func']('str', 123)"] + tail, 'E119:')
508 CheckScriptFailure(head + ["funcMap['func']('str', 123, [1], 4)"] + tail, 'E118:') 508 CheckScriptFailure(head + ["funcMap['func']('str', 123, [1], 4)"] + tail, 'E118:')
509 enddef 509 enddef
510 510
511 def Test_call_lambda_args() 511 def Test_call_lambda_args()
512 CheckDefFailure(['echo {i -> 0}()'], 512 CheckDefFailure(['echo ((i) => 0)()'],
513 'E119: Not enough arguments for function: {i -> 0}()') 513 'E119: Not enough arguments for function: ((i) => 0)()')
514 514
515 var lines =<< trim END 515 var lines =<< trim END
516 var Ref = {x: number, y: number -> x + y} 516 var Ref = (x: number, y: number) => x + y
517 echo Ref(1, 'x') 517 echo Ref(1, 'x')
518 END 518 END
519 CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got string') 519 CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got string')
520 enddef 520 enddef
521 521
522 def Test_lambda_uses_assigned_var() 522 def Test_lambda_uses_assigned_var()
523 CheckDefSuccess([ 523 CheckDefSuccess([
524 'var x: any = "aaa"' 524 'var x: any = "aaa"'
525 'x = filter(["bbb"], {_, v -> v =~ x})']) 525 'x = filter(["bbb"], (_, v) => v =~ x)'])
526 enddef 526 enddef
527 527
528 " Default arg and varargs 528 " Default arg and varargs
529 def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 529 def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
530 var res = one .. ',' .. two 530 var res = one .. ',' .. two
1411 return Ref('more') 1411 return Ref('more')
1412 enddef 1412 enddef
1413 1413
1414 def Test_closure_simple() 1414 def Test_closure_simple()
1415 var local = 'some ' 1415 var local = 'some '
1416 RefFunc({s -> local .. s})->assert_equal('some more') 1416 RefFunc((s) => local .. s)->assert_equal('some more')
1417 enddef 1417 enddef
1418 1418
1419 def MakeRef() 1419 def MakeRef()
1420 var local = 'some ' 1420 var local = 'some '
1421 g:Ref = {s -> local .. s} 1421 g:Ref = (s) => local .. s
1422 enddef 1422 enddef
1423 1423
1424 def Test_closure_ref_after_return() 1424 def Test_closure_ref_after_return()
1425 MakeRef() 1425 MakeRef()
1426 g:Ref('thing')->assert_equal('some thing') 1426 g:Ref('thing')->assert_equal('some thing')
1427 unlet g:Ref 1427 unlet g:Ref
1428 enddef 1428 enddef
1429 1429
1430 def MakeTwoRefs() 1430 def MakeTwoRefs()
1431 var local = ['some'] 1431 var local = ['some']
1432 g:Extend = {s -> local->add(s)} 1432 g:Extend = (s) => local->add(s)
1433 g:Read = {-> local} 1433 g:Read = () => local
1434 enddef 1434 enddef
1435 1435
1436 def Test_closure_two_refs() 1436 def Test_closure_two_refs()
1437 MakeTwoRefs() 1437 MakeTwoRefs()
1438 join(g:Read(), ' ')->assert_equal('some') 1438 join(g:Read(), ' ')->assert_equal('some')
1465 unlet g:Read 1465 unlet g:Read
1466 enddef 1466 enddef
1467 1467
1468 def MakeArgRefs(theArg: string) 1468 def MakeArgRefs(theArg: string)
1469 var local = 'loc_val' 1469 var local = 'loc_val'
1470 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s} 1470 g:UseArg = (s) => theArg .. '/' .. local .. '/' .. s
1471 enddef 1471 enddef
1472 1472
1473 def MakeArgRefsVarargs(theArg: string, ...rest: list<string>) 1473 def MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
1474 var local = 'the_loc' 1474 var local = 'the_loc'
1475 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)} 1475 g:UseVararg = (s) => theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)
1476 enddef 1476 enddef
1477 1477
1478 def Test_closure_using_argument() 1478 def Test_closure_using_argument()
1479 MakeArgRefs('arg_val') 1479 MakeArgRefs('arg_val')
1480 g:UseArg('call_val')->assert_equal('arg_val/loc_val/call_val') 1480 g:UseArg('call_val')->assert_equal('arg_val/loc_val/call_val')
1524 return a:Ref('some') 1524 return a:Ref('some')
1525 endfunc 1525 endfunc
1526 1526
1527 def Test_call_closure_not_compiled() 1527 def Test_call_closure_not_compiled()
1528 var text = 'text' 1528 var text = 'text'
1529 g:Ref = {s -> s .. text} 1529 g:Ref = (s) => s .. text
1530 GetResult(g:Ref)->assert_equal('sometext') 1530 GetResult(g:Ref)->assert_equal('sometext')
1531 enddef 1531 enddef
1532 1532
1533 def Test_double_closure_fails() 1533 def Test_double_closure_fails()
1534 var lines =<< trim END 1534 var lines =<< trim END
1535 vim9script 1535 vim9script
1536 def Func() 1536 def Func()
1537 var name = 0 1537 var name = 0
1538 for i in range(2) 1538 for i in range(2)
1539 timer_start(0, {-> name}) 1539 timer_start(0, () => name)
1540 endfor 1540 endfor
1541 enddef 1541 enddef
1542 Func() 1542 Func()
1543 END 1543 END
1544 CheckScriptSuccess(lines) 1544 CheckScriptSuccess(lines)
1547 def Test_nested_closure_used() 1547 def Test_nested_closure_used()
1548 var lines =<< trim END 1548 var lines =<< trim END
1549 vim9script 1549 vim9script
1550 def Func() 1550 def Func()
1551 var x = 'hello' 1551 var x = 'hello'
1552 var Closure = {-> x} 1552 var Closure = () => x
1553 g:Myclosure = {-> Closure()} 1553 g:Myclosure = () => Closure()
1554 enddef 1554 enddef
1555 Func() 1555 Func()
1556 assert_equal('hello', g:Myclosure()) 1556 assert_equal('hello', g:Myclosure())
1557 END 1557 END
1558 CheckScriptSuccess(lines) 1558 CheckScriptSuccess(lines)
1563 vim9script 1563 vim9script
1564 def FuncA() 1564 def FuncA()
1565 FuncB(0) 1565 FuncB(0)
1566 enddef 1566 enddef
1567 def FuncB(n: number): list<string> 1567 def FuncB(n: number): list<string>
1568 return map([0], {_, v -> n}) 1568 return map([0], (_, v) => n)
1569 enddef 1569 enddef
1570 FuncA() 1570 FuncA()
1571 END 1571 END
1572 CheckScriptFailure(lines, 'E1012:') 1572 CheckScriptFailure(lines, 'E1012:')
1573 enddef 1573 enddef
1640 def Test_nested_lambda() 1640 def Test_nested_lambda()
1641 var lines =<< trim END 1641 var lines =<< trim END
1642 vim9script 1642 vim9script
1643 def Func() 1643 def Func()
1644 var x = 4 1644 var x = 4
1645 var Lambda1 = {-> 7} 1645 var Lambda1 = () => 7
1646 var Lambda2 = {-> [Lambda1(), x]} 1646 var Lambda2 = () => [Lambda1(), x]
1647 var res = Lambda2() 1647 var res = Lambda2()
1648 assert_equal([7, 4], res) 1648 assert_equal([7, 4], res)
1649 enddef 1649 enddef
1650 Func() 1650 Func()
1651 END 1651 END
1652 CheckScriptSuccess(lines) 1652 CheckScriptSuccess(lines)
1653 enddef 1653 enddef
1654 1654
1655 def Shadowed(): list<number> 1655 def Shadowed(): list<number>
1656 var FuncList: list<func: number> = [{ -> 42}] 1656 var FuncList: list<func: number> = [() => 42]
1657 return FuncList->map({_, Shadowed -> Shadowed()}) 1657 return FuncList->map((_, Shadowed) => Shadowed())
1658 enddef 1658 enddef
1659 1659
1660 def Test_lambda_arg_shadows_func() 1660 def Test_lambda_arg_shadows_func()
1661 assert_equal([42], Shadowed()) 1661 assert_equal([42], Shadowed())
1662 enddef 1662 enddef
1674 1674
1675 def Test_script_var_in_lambda() 1675 def Test_script_var_in_lambda()
1676 var lines =<< trim END 1676 var lines =<< trim END
1677 vim9script 1677 vim9script
1678 var script = 'test' 1678 var script = 'test'
1679 assert_equal(['test'], map(['one'], {-> script})) 1679 assert_equal(['test'], map(['one'], () => script))
1680 END 1680 END
1681 CheckScriptSuccess(lines) 1681 CheckScriptSuccess(lines)
1682 enddef 1682 enddef
1683 1683
1684 def Line_continuation_in_lambda(): list<string> 1684 def Line_continuation_in_lambda(): list<string>
1685 var x = range(97, 100) 1685 var x = range(97, 100)
1686 ->map({_, v -> nr2char(v) 1686 ->map((_, v) => nr2char(v)
1687 ->toupper()}) 1687 ->toupper())
1688 ->reverse() 1688 ->reverse()
1689 return x 1689 return x
1690 enddef 1690 enddef
1691 1691
1692 def Test_line_continuation_in_lambda() 1692 def Test_line_continuation_in_lambda()
1770 def Test_recursive_call() 1770 def Test_recursive_call()
1771 Fibonacci(20)->assert_equal(6765) 1771 Fibonacci(20)->assert_equal(6765)
1772 enddef 1772 enddef
1773 1773
1774 def TreeWalk(dir: string): list<any> 1774 def TreeWalk(dir: string): list<any>
1775 return readdir(dir)->map({_, val -> 1775 return readdir(dir)->map((_, val) =>
1776 fnamemodify(dir .. '/' .. val, ':p')->isdirectory() 1776 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
1777 ? {[val]: TreeWalk(dir .. '/' .. val)} 1777 ? {[val]: TreeWalk(dir .. '/' .. val)}
1778 : val 1778 : val
1779 }) 1779 )
1780 enddef 1780 enddef
1781 1781
1782 def Test_closure_in_map() 1782 def Test_closure_in_map()
1783 mkdir('XclosureDir/tdir', 'p') 1783 mkdir('XclosureDir/tdir', 'p')
1784 writefile(['111'], 'XclosureDir/file1') 1784 writefile(['111'], 'XclosureDir/file1')
1888 vim9script 1888 vim9script
1889 def Func() 1889 def Func()
1890 var x = ['a', 'b', 'c'] 1890 var x = ['a', 'b', 'c']
1891 if 1 1891 if 1
1892 var y = 'x' 1892 var y = 'x'
1893 map(x, {-> y}) 1893 map(x, () => y)
1894 endif 1894 endif
1895 var z = x 1895 var z = x
1896 assert_equal(['x', 'x', 'x'], z) 1896 assert_equal(['x', 'x', 'x'], z)
1897 enddef 1897 enddef
1898 Func() 1898 Func()
1920 # builtin function considered failing 1920 # builtin function considered failing
1921 var lines =<< trim END 1921 var lines =<< trim END
1922 vim9script 1922 vim9script
1923 au BufWinLeave * # 1923 au BufWinLeave * #
1924 def Func() 1924 def Func()
1925 popup_menu('', {callback: {-> popup_create('', {})->popup_close()}}) 1925 popup_menu('', {callback: () => popup_create('', {})->popup_close()})
1926 eval [][0] 1926 eval [][0]
1927 enddef 1927 enddef
1928 nno <F3> <cmd>call <sid>Func()<cr> 1928 nno <F3> <cmd>call <sid>Func()<cr>
1929 feedkeys("\<F3>\e", 'xt') 1929 feedkeys("\<F3>\e", 'xt')
1930 END 1930 END
2012 vim9script 2012 vim9script
2013 g:result = 'none' 2013 g:result = 'none'
2014 var d: dict<any> 2014 var d: dict<any>
2015 def Func() 2015 def Func()
2016 try 2016 try
2017 g:result = map([], {_, v -> {}[v]})->join() .. d[''] 2017 g:result = map([], (_, v) => ({}[v]))->join() .. d['']
2018 catch 2018 catch
2019 endtry 2019 endtry
2020 enddef 2020 enddef
2021 silent! Func() 2021 silent! Func()
2022 assert_equal('0', g:result) 2022 assert_equal('0', g:result)