comparison src/testdir/test_vim9_expr.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 681f042ae5ac
children ab163feb30cb
comparison
equal deleted inserted replaced
23427:8f2dcc0cfcf6 23428:5807e3958e38
1804 CheckScriptFailure(lines, 'E117:', 1) 1804 CheckScriptFailure(lines, 'E117:', 1)
1805 endif 1805 endif
1806 enddef 1806 enddef
1807 1807
1808 def LambdaWithComments(): func 1808 def LambdaWithComments(): func
1809 return {x -> 1809 return (x) =>
1810 # some comment 1810 # some comment
1811 x == 1 1811 x == 1
1812 # some comment 1812 # some comment
1813 || 1813 ||
1814 x == 2 1814 x == 2
1815 }
1816 enddef 1815 enddef
1817 1816
1818 def LambdaUsingArg(x: number): func 1817 def LambdaUsingArg(x: number): func
1819 return {-> 1818 return () =>
1820 # some comment 1819 # some comment
1821 x == 1 1820 x == 1
1822 # some comment 1821 # some comment
1823 || 1822 ||
1824 x == 2 1823 x == 2
1825 }
1826 enddef 1824 enddef
1827 1825
1828 def Test_expr7_lambda() 1826 def Test_expr7_lambda()
1829 var lines =<< trim END 1827 var lines =<< trim END
1830 var La = { -> 'result'} 1828 var La = () => 'result'
1831 assert_equal('result', La()) 1829 assert_equal('result', La())
1832 assert_equal([1, 3, 5], [1, 2, 3]->map({key, val -> key + val})) 1830 assert_equal([1, 3, 5], [1, 2, 3]->map((key, val) => key + val))
1833 1831
1834 # line continuation inside lambda with "cond ? expr : expr" works 1832 # line continuation inside lambda with "cond ? expr : expr" works
1835 var ll = range(3) 1833 var ll = range(3)
1836 map(ll, {k, v -> v % 2 ? { 1834 map(ll, (k, v) => v % 2 ? {
1837 ['111']: 111 } : {} 1835 ['111']: 111 } : {}
1838 }) 1836 )
1839 assert_equal([{}, {111: 111}, {}], ll) 1837 assert_equal([{}, {111: 111}, {}], ll)
1840 1838
1841 ll = range(3) 1839 ll = range(3)
1842 map(ll, {k, v -> v == 8 || v 1840 map(ll, (k, v) => v == 8 || v
1843 == 9 1841 == 9
1844 || v % 2 ? 111 : 222 1842 || v % 2 ? 111 : 222
1845 }) 1843 )
1846 assert_equal([222, 111, 222], ll) 1844 assert_equal([222, 111, 222], ll)
1847 1845
1848 ll = range(3) 1846 ll = range(3)
1849 map(ll, {k, v -> v != 8 && v 1847 map(ll, (k, v) => v != 8 && v
1850 != 9 1848 != 9
1851 && v % 2 == 0 ? 111 : 222 1849 && v % 2 == 0 ? 111 : 222
1852 }) 1850 )
1853 assert_equal([111, 222, 111], ll) 1851 assert_equal([111, 222, 111], ll)
1854 1852
1855 var dl = [{key: 0}, {key: 22}]->filter({ _, v -> v['key'] }) 1853 var dl = [{key: 0}, {key: 22}]->filter(( _, v) => v['key'] )
1856 assert_equal([{key: 22}], dl) 1854 assert_equal([{key: 22}], dl)
1857 1855
1858 dl = [{key: 12}, {['foo']: 34}] 1856 dl = [{key: 12}, {['foo']: 34}]
1859 assert_equal([{key: 12}], filter(dl, 1857 assert_equal([{key: 12}], filter(dl,
1860 {_, v -> has_key(v, 'key') ? v['key'] == 12 : 0})) 1858 (_, v) => has_key(v, 'key') ? v['key'] == 12 : 0))
1861 1859
1862 assert_equal(false, LambdaWithComments()(0)) 1860 assert_equal(false, LambdaWithComments()(0))
1863 assert_equal(true, LambdaWithComments()(1)) 1861 assert_equal(true, LambdaWithComments()(1))
1864 assert_equal(true, LambdaWithComments()(2)) 1862 assert_equal(true, LambdaWithComments()(2))
1865 assert_equal(false, LambdaWithComments()(3)) 1863 assert_equal(false, LambdaWithComments()(3))
1866 1864
1867 assert_equal(false, LambdaUsingArg(0)()) 1865 assert_equal(false, LambdaUsingArg(0)())
1868 assert_equal(true, LambdaUsingArg(1)()) 1866 assert_equal(true, LambdaUsingArg(1)())
1869 1867
1870 var res = map([1, 2, 3], {i: number, v: number -> i + v}) 1868 var res = map([1, 2, 3], (i: number, v: number) => i + v)
1871 assert_equal([1, 3, 5], res) 1869 assert_equal([1, 3, 5], res)
1872 END 1870 END
1873 CheckDefAndScriptSuccess(lines) 1871 CheckDefAndScriptSuccess(lines)
1874 1872
1875 CheckDefFailure(["var Ref = {a->a + 1}"], 'E1004:') 1873 CheckDefFailure(["var Ref = (a)=>a + 1"], 'E1004:')
1876 CheckDefFailure(["var Ref = {a-> a + 1}"], 'E1004:') 1874 CheckDefFailure(["var Ref = (a)=> a + 1"], 'E1004:')
1877 CheckDefFailure(["var Ref = {a ->a + 1}"], 'E1004:') 1875 CheckDefFailure(["var Ref = (a) =>a + 1"], 'E1004:')
1878 1876
1879 CheckDefFailure(["filter([1, 2], {k,v -> 1})"], 'E1069:', 1) 1877 CheckDefFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1)
1880 # error is in first line of the lambda 1878 # error is in first line of the lambda
1881 CheckDefFailure(["var L = {a -> a + b}"], 'E1001:', 0) 1879 CheckDefFailure(["var L = (a) => a + b"], 'E1001:', 0)
1882 1880
1883 assert_equal('xxxyyy', 'xxx'->{a, b -> a .. b}('yyy')) 1881 assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy'))
1884 1882
1885 CheckDefExecFailure(["var s = 'asdf'->{a -> a}('x')"], 1883 CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"], 'E118:')
1886 'E1106: One argument too many') 1884 CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"], 'E118:')
1887 CheckDefExecFailure(["var s = 'asdf'->{a -> a}('x', 'y')"], 1885 CheckDefFailure(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 1)
1888 'E1106: 2 arguments too many') 1886
1889 CheckDefFailure(["echo 'asdf'->{a -> a}(x)"], 'E1001:', 1) 1887 CheckDefSuccess(['var Fx = (a) => ({k1: 0,', ' k2: 1})'])
1890 1888 CheckDefFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2)
1891 CheckDefSuccess(['var Fx = {a -> {k1: 0,', ' k2: 1}}']) 1889 CheckDefFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2)
1892 CheckDefFailure(['var Fx = {a -> {k1: 0', ' k2: 1}}'], 'E722:', 2) 1890
1893 CheckDefFailure(['var Fx = {a -> {k1: 0,', ' k2 1}}'], 'E720:', 2) 1891 CheckDefSuccess(['var Fx = (a) => [0,', ' 1]'])
1894 1892 CheckDefFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2)
1895 CheckDefSuccess(['var Fx = {a -> [0,', ' 1]}'])
1896 CheckDefFailure(['var Fx = {a -> [0', ' 1]}'], 'E696:', 2)
1897 enddef 1893 enddef
1898 1894
1899 def NewLambdaWithComments(): func 1895 def NewLambdaWithComments(): func
1900 return (x) => 1896 return (x) =>
1901 # some comment 1897 # some comment
2000 enddef 1996 enddef
2001 1997
2002 def Test_expr7_lambda_vim9script() 1998 def Test_expr7_lambda_vim9script()
2003 var lines =<< trim END 1999 var lines =<< trim END
2004 vim9script 2000 vim9script
2005 var v = 10->{a -> 2001 var v = 10->((a) =>
2006 a 2002 a
2007 + 2 2003 + 2
2008 }() 2004 )()
2009 assert_equal(12, v) 2005 assert_equal(12, v)
2010 END 2006 END
2011 CheckScriptSuccess(lines) 2007 CheckScriptSuccess(lines)
2012 2008
2013 # nested lambda with line breaks 2009 # nested lambda with line breaks
2014 lines =<< trim END 2010 lines =<< trim END
2015 vim9script 2011 vim9script
2016 search('"', 'cW', 0, 0, {-> 2012 search('"', 'cW', 0, 0, () =>
2017 synstack('.', col('.')) 2013 synstack('.', col('.'))
2018 ->map({_, v -> synIDattr(v, 'name')})->len()}) 2014 ->map((_, v) => synIDattr(v, 'name'))->len())
2019 END 2015 END
2020 CheckScriptSuccess(lines) 2016 CheckScriptSuccess(lines)
2021 enddef 2017 enddef
2022 2018
2023 def Test_epxr7_funcref() 2019 def Test_epxr7_funcref()
2087 # legacy syntax doesn't work 2083 # legacy syntax doesn't work
2088 CheckDefFailure(["var x = #{key: 8}"], 'E1097:', 3) 2084 CheckDefFailure(["var x = #{key: 8}"], 'E1097:', 3)
2089 CheckDefFailure(["var x = 'a' .. #{a: 1}"], 'E1097:', 3) 2085 CheckDefFailure(["var x = 'a' .. #{a: 1}"], 'E1097:', 3)
2090 2086
2091 CheckDefFailure(["var x = {a:8}"], 'E1069:', 1) 2087 CheckDefFailure(["var x = {a:8}"], 'E1069:', 1)
2092 CheckDefFailure(["var x = {a : 8}"], 'E1059:', 1) 2088 CheckDefFailure(["var x = {a : 8}"], 'E1068:', 1)
2093 CheckDefFailure(["var x = {a :8}"], 'E1059:', 1) 2089 CheckDefFailure(["var x = {a :8}"], 'E1068:', 1)
2094 CheckDefFailure(["var x = {a: 8 , b: 9}"], 'E1068:', 1) 2090 CheckDefFailure(["var x = {a: 8 , b: 9}"], 'E1068:', 1)
2095 CheckDefFailure(["var x = {a: 1,b: 2}"], 'E1069:', 1) 2091 CheckDefFailure(["var x = {a: 1,b: 2}"], 'E1069:', 1)
2096 2092
2097 CheckDefFailure(["var x = {xxx}"], 'E720:', 1) 2093 CheckDefFailure(["var x = {xxx}"], 'E720:', 1)
2098 CheckDefFailure(["var x = {xxx: 1", "var y = 2"], 'E722:', 2) 2094 CheckDefFailure(["var x = {xxx: 1", "var y = 2"], 'E722:', 2)
2137 # comment 2133 # comment
2138 # comment 2134 # comment
2139 ['two']: 2, 2135 ['two']: 2,
2140 } 2136 }
2141 assert_equal({one: 1, two: 2}, d) 2137 assert_equal({one: 1, two: 2}, d)
2138
2139 var dd = {k: 123->len()}
2140 assert_equal(3, dd.k)
2142 END 2141 END
2143 CheckScriptSuccess(lines) 2142 CheckScriptSuccess(lines)
2144 2143
2145 lines =<< trim END 2144 lines =<< trim END
2146 vim9script 2145 vim9script
2172 2171
2173 lines =<< trim END 2172 lines =<< trim END
2174 vim9script 2173 vim9script
2175 var d = {one : 1} 2174 var d = {one : 1}
2176 END 2175 END
2177 CheckScriptFailure(lines, 'E1059:', 2) 2176 CheckScriptFailure(lines, 'E1068:', 2)
2178 2177
2179 lines =<< trim END 2178 lines =<< trim END
2180 vim9script 2179 vim9script
2181 var d = {one:1} 2180 var d = {one:1}
2182 END 2181 END
2627 assert_equal(true, ! ! ! g:false) 2626 assert_equal(true, ! ! ! g:false)
2628 unlet g:true 2627 unlet g:true
2629 unlet g:false 2628 unlet g:false
2630 2629
2631 assert_equal(true, !test_null_partial()) 2630 assert_equal(true, !test_null_partial())
2632 assert_equal(false, !{-> 'yes'}) 2631 assert_equal(false, !() => 'yes')
2633 2632
2634 assert_equal(true, !test_null_dict()) 2633 assert_equal(true, !test_null_dict())
2635 assert_equal(true, !{}) 2634 assert_equal(true, !{})
2636 assert_equal(false, !{yes: 'no'}) 2635 assert_equal(false, !{yes: 'no'})
2637 2636
2666 call CheckDefFailure(["var x = @<"], "E354:", 1) 2665 call CheckDefFailure(["var x = @<"], "E354:", 1)
2667 2666
2668 call CheckDefFailure(["var x = [1, 2"], "E697:", 2) 2667 call CheckDefFailure(["var x = [1, 2"], "E697:", 2)
2669 call CheckDefFailure(["var x = [notfound]"], "E1001:", 1) 2668 call CheckDefFailure(["var x = [notfound]"], "E1001:", 1)
2670 2669
2671 call CheckDefFailure(["var x = { -> 123) }"], "E451:", 1) 2670 call CheckDefFailure(["var X = () => 123)"], "E488:", 1)
2672 call CheckDefFailure(["var x = 123->{x -> x + 5) }"], "E451:", 1) 2671 call CheckDefFailure(["var x = 123->((x) => x + 5)"], "E107:", 1)
2673 2672
2674 call CheckDefFailure(["var x = &notexist"], 'E113:', 1) 2673 call CheckDefFailure(["var x = &notexist"], 'E113:', 1)
2675 call CheckDefFailure(["&grepprg = [343]"], 'E1012:', 1) 2674 call CheckDefFailure(["&grepprg = [343]"], 'E1012:', 1)
2676 2675
2677 call CheckDefExecFailure(["echo s:doesnt_exist"], 'E121:', 1) 2676 call CheckDefExecFailure(["echo s:doesnt_exist"], 'E121:', 1)
2689 call CheckDefFailure(["var x = ''", "var y = x.memb"], 'E715:', 2) 2688 call CheckDefFailure(["var x = ''", "var y = x.memb"], 'E715:', 2)
2690 2689
2691 call CheckDefFailure(["'yes'->", "Echo()"], 'E488: Trailing characters: ->', 1) 2690 call CheckDefFailure(["'yes'->", "Echo()"], 'E488: Trailing characters: ->', 1)
2692 2691
2693 call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2) 2692 call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2)
2694 call CheckDefExecFailure(["{a: 1->len()"], 'E1004:', 1) 2693 call CheckDefExecFailure(["{a: 1->len()"], 'E723:', 2)
2695 call CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2) 2694 call CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2)
2696 endfunc 2695 endfunc
2697 2696
2698 let g:Funcrefs = [function('add')] 2697 let g:Funcrefs = [function('add')]
2699 2698
2723 g:Funcrefs[0](l, 2) 2722 g:Funcrefs[0](l, 2)
2724 assert_equal([2], l) 2723 assert_equal([2], l)
2725 2724
2726 # method call 2725 # method call
2727 l = [2, 5, 6] 2726 l = [2, 5, 6]
2728 l->map({k, v -> k + v}) 2727 l->map((k, v) => k + v)
2729 assert_equal([2, 6, 8], l) 2728 assert_equal([2, 6, 8], l)
2730 2729
2731 # lambda method call 2730 # lambda method call
2732 l = [2, 5] 2731 l = [2, 5]
2733 l->{l -> add(l, 8)}() 2732 l->((l) => add(l, 8))()
2734 assert_equal([2, 5, 8], l) 2733 assert_equal([2, 5, 8], l)
2735 2734
2736 # dict member 2735 # dict member
2737 var d = {key: 123} 2736 var d = {key: 123}
2738 assert_equal(123, d.key) 2737 assert_equal(123, d.key)
2893 assert_equal(33, d. 2892 assert_equal(33, d.
2894 one) 2893 one)
2895 enddef 2894 enddef
2896 2895
2897 func Test_expr7_trailing_fails() 2896 func Test_expr7_trailing_fails()
2898 call CheckDefFailure(['var l = [2]', 'l->{l -> add(l, 8)}'], 'E107:', 2) 2897 call CheckDefFailure(['var l = [2]', 'l->((l) => add(l, 8))'], 'E107:', 2)
2899 call CheckDefFailure(['var l = [2]', 'l->{l -> add(l, 8)} ()'], 'E274:', 2) 2898 call CheckDefFailure(['var l = [2]', 'l->((l) => add(l, 8)) ()'], 'E274:', 2)
2900 endfunc 2899 endfunc
2901 2900
2902 func Test_expr_fails() 2901 func Test_expr_fails()
2903 call CheckDefFailure(["var x = '1'is2"], 'E488:', 1) 2902 call CheckDefFailure(["var x = '1'is2"], 'E488:', 1)
2904 call CheckDefFailure(["var x = '1'isnot2"], 'E488:', 1) 2903 call CheckDefFailure(["var x = '1'isnot2"], 'E488:', 1)