Mercurial > vim
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 = ¬exist"], 'E113:', 1) | 2673 call CheckDefFailure(["var x = ¬exist"], '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) |