comparison src/testdir/test_vim9_expr.vim @ 27191:63f8dbcf6a74 v8.2.4124

patch 8.2.4124: Vim9: method in compiled function may not see script item Commit: https://github.com/vim/vim/commit/6389baa6691fde4ca56ec6243ed83322543df300 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jan 17 20:50:40 2022 +0000 patch 8.2.4124: Vim9: method in compiled function may not see script item Problem: Vim9: method in compiled function may not see script item. Solution: Make sure not to skip to the next line. (closes https://github.com/vim/vim/issues/9496)
author Bram Moolenaar <Bram@vim.org>
date Mon, 17 Jan 2022 22:00:03 +0100
parents 6af18c69c59d
children d4f254d02d7c
comparison
equal deleted inserted replaced
27190:19849ccc38a0 27191:63f8dbcf6a74
1715 let g:dict_one = #{one: 1} 1715 let g:dict_one = #{one: 1}
1716 1716
1717 let $TESTVAR = 'testvar' 1717 let $TESTVAR = 'testvar'
1718 1718
1719 " type casts 1719 " type casts
1720 def Test_expr7t() 1720 def Test_expr7()
1721 var lines =<< trim END 1721 var lines =<< trim END
1722 var ls: list<string> = ['a', <string>g:string_empty] 1722 var ls: list<string> = ['a', <string>g:string_empty]
1723 var ln: list<number> = [<number>g:anint, <number>g:thefour] 1723 var ln: list<number> = [<number>g:anint, <number>g:thefour]
1724 var nr = <number>234 1724 var nr = <number>234
1725 assert_equal(234, nr) 1725 assert_equal(234, nr)
1741 CheckDefAndScriptFailure(["var x = <number >123"], 'E1068:', 1) 1741 CheckDefAndScriptFailure(["var x = <number >123"], 'E1068:', 1)
1742 CheckDefAndScriptFailure(["var x = <number 123"], 'E1104:', 1) 1742 CheckDefAndScriptFailure(["var x = <number 123"], 'E1104:', 1)
1743 enddef 1743 enddef
1744 1744
1745 " test low level expression 1745 " test low level expression
1746 def Test_expr7_number() 1746 def Test_expr8_number()
1747 # number constant 1747 # number constant
1748 var lines =<< trim END 1748 var lines =<< trim END
1749 assert_equal(0, 0) 1749 assert_equal(0, 0)
1750 assert_equal(654, 0654) 1750 assert_equal(654, 0654)
1751 1751
1754 assert_equal(255, 0xff) 1754 assert_equal(255, 0xff)
1755 END 1755 END
1756 CheckDefAndScriptSuccess(lines) 1756 CheckDefAndScriptSuccess(lines)
1757 enddef 1757 enddef
1758 1758
1759 def Test_expr7_float() 1759 def Test_expr8_float()
1760 # float constant 1760 # float constant
1761 if !has('float') 1761 if !has('float')
1762 MissingFeature 'float' 1762 MissingFeature 'float'
1763 else 1763 else
1764 var lines =<< trim END 1764 var lines =<< trim END
1769 END 1769 END
1770 CheckDefAndScriptSuccess(lines) 1770 CheckDefAndScriptSuccess(lines)
1771 endif 1771 endif
1772 enddef 1772 enddef
1773 1773
1774 def Test_expr7_blob() 1774 def Test_expr8_blob()
1775 # blob constant 1775 # blob constant
1776 var lines =<< trim END 1776 var lines =<< trim END
1777 assert_equal(g:blob_empty, 0z) 1777 assert_equal(g:blob_empty, 0z)
1778 assert_equal(g:blob_one, 0z01) 1778 assert_equal(g:blob_one, 0z01)
1779 assert_equal(g:blob_long, 0z0102.0304) 1779 assert_equal(g:blob_long, 0z0102.0304)
1801 CheckDefAndScriptSuccess(lines) 1801 CheckDefAndScriptSuccess(lines)
1802 1802
1803 CheckDefAndScriptFailure(["var x = 0z123"], 'E973:', 1) 1803 CheckDefAndScriptFailure(["var x = 0z123"], 'E973:', 1)
1804 enddef 1804 enddef
1805 1805
1806 def Test_expr7_string() 1806 def Test_expr8_string()
1807 # string constant 1807 # string constant
1808 var lines =<< trim END 1808 var lines =<< trim END
1809 assert_equal(g:string_empty, '') 1809 assert_equal(g:string_empty, '')
1810 assert_equal(g:string_empty, "") 1810 assert_equal(g:string_empty, "")
1811 assert_equal(g:string_short, 'x') 1811 assert_equal(g:string_short, 'x')
1818 1818
1819 CheckDefAndScriptFailure(['var x = "abc'], 'E114:', 1) 1819 CheckDefAndScriptFailure(['var x = "abc'], 'E114:', 1)
1820 CheckDefAndScriptFailure(["var x = 'abc"], 'E115:', 1) 1820 CheckDefAndScriptFailure(["var x = 'abc"], 'E115:', 1)
1821 enddef 1821 enddef
1822 1822
1823 def Test_expr7_vimvar() 1823 def Test_expr8_vimvar()
1824 v:errors = [] 1824 v:errors = []
1825 var errs: list<string> = v:errors 1825 var errs: list<string> = v:errors
1826 CheckDefFailure(['var errs: list<number> = v:errors'], 'E1012:') 1826 CheckDefFailure(['var errs: list<number> = v:errors'], 'E1012:')
1827 1827
1828 var old: list<string> = v:oldfiles 1828 var old: list<string> = v:oldfiles
1843 exec "normal! afoo fo\<C-N>\<Esc>" 1843 exec "normal! afoo fo\<C-N>\<Esc>"
1844 CheckDefExecAndScriptFailure(["var old: dict<number> = v:completed_item"], 'E1012: Type mismatch; expected dict<number> but got dict<string>', 1) 1844 CheckDefExecAndScriptFailure(["var old: dict<number> = v:completed_item"], 'E1012: Type mismatch; expected dict<number> but got dict<string>', 1)
1845 bwipe! 1845 bwipe!
1846 enddef 1846 enddef
1847 1847
1848 def Test_expr7_special() 1848 def Test_expr8_special()
1849 # special constant 1849 # special constant
1850 var lines =<< trim END 1850 var lines =<< trim END
1851 assert_equal(g:special_true, true) 1851 assert_equal(g:special_true, true)
1852 assert_equal(g:special_false, false) 1852 assert_equal(g:special_false, false)
1853 assert_equal(g:special_true, v:true) 1853 assert_equal(g:special_true, v:true)
1880 CheckDefAndScriptFailure(['v:false = true'], 'E46:', 1) 1880 CheckDefAndScriptFailure(['v:false = true'], 'E46:', 1)
1881 CheckDefAndScriptFailure(['v:null = 11'], 'E46:', 1) 1881 CheckDefAndScriptFailure(['v:null = 11'], 'E46:', 1)
1882 CheckDefAndScriptFailure(['v:none = 22'], 'E46:', 1) 1882 CheckDefAndScriptFailure(['v:none = 22'], 'E46:', 1)
1883 enddef 1883 enddef
1884 1884
1885 def Test_expr7_list() 1885 def Test_expr8_list()
1886 # list 1886 # list
1887 var lines =<< trim END 1887 var lines =<< trim END
1888 assert_equal(g:list_empty, []) 1888 assert_equal(g:list_empty, [])
1889 assert_equal(g:list_empty, [ ]) 1889 assert_equal(g:list_empty, [ ])
1890 1890
1953 'E1004: White space required before and after '':'' at ":b]"', 4) 1953 'E1004: White space required before and after '':'' at ":b]"', 4)
1954 CheckDefAndScriptFailure(lines + ['echo numbers[1: b]'], 'E1004:', 4) 1954 CheckDefAndScriptFailure(lines + ['echo numbers[1: b]'], 'E1004:', 4)
1955 CheckDefAndScriptFailure(lines + ['echo numbers[a :b]'], 'E1004:', 4) 1955 CheckDefAndScriptFailure(lines + ['echo numbers[a :b]'], 'E1004:', 4)
1956 enddef 1956 enddef
1957 1957
1958 def Test_expr7_list_vim9script() 1958 def Test_expr8_list_vim9script()
1959 var lines =<< trim END 1959 var lines =<< trim END
1960 var l = [ 1960 var l = [
1961 11, 1961 11,
1962 22, 1962 22,
1963 ] 1963 ]
2041 # some comment 2041 # some comment
2042 || 2042 ||
2043 x == 2 2043 x == 2
2044 enddef 2044 enddef
2045 2045
2046 def Test_expr7_lambda() 2046 def Test_expr8_lambda()
2047 var lines =<< trim END 2047 var lines =<< trim END
2048 var La = () => 'result' 2048 var La = () => 'result'
2049 # comment 2049 # comment
2050 assert_equal('result', La()) 2050 assert_equal('result', La())
2051 assert_equal([1, 3, 5], [1, 2, 3]->map((key, val) => key + val)) 2051 assert_equal([1, 3, 5], [1, 2, 3]->map((key, val) => key + val))
2127 eval (name + 2) / 3 2127 eval (name + 2) / 3
2128 END 2128 END
2129 CheckDefAndScriptSuccess(lines) 2129 CheckDefAndScriptSuccess(lines)
2130 enddef 2130 enddef
2131 2131
2132 def Test_expr7_lambda_block() 2132 def Test_expr8_lambda_block()
2133 var lines =<< trim END 2133 var lines =<< trim END
2134 var Func = (s: string): string => { 2134 var Func = (s: string): string => {
2135 return 'hello ' .. s 2135 return 'hello ' .. s
2136 } 2136 }
2137 assert_equal('hello there', Func('there')) 2137 assert_equal('hello there', Func('there'))
2207 # some comment 2207 # some comment
2208 || 2208 ||
2209 x == 2 2209 x == 2
2210 enddef 2210 enddef
2211 2211
2212 def Test_expr7_new_lambda() 2212 def Test_expr8_new_lambda()
2213 var lines =<< trim END 2213 var lines =<< trim END
2214 var La = () => 'result' 2214 var La = () => 'result'
2215 assert_equal('result', La()) 2215 assert_equal('result', La())
2216 assert_equal([1, 3, 5], [1, 2, 3]->map((key, val) => key + val)) 2216 assert_equal([1, 3, 5], [1, 2, 3]->map((key, val) => key + val))
2217 2217
2292 CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2) 2292 CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2)
2293 2293
2294 CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2) 2294 CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2)
2295 enddef 2295 enddef
2296 2296
2297 def Test_expr7_lambda_vim9script() 2297 def Test_expr8_lambda_vim9script()
2298 var lines =<< trim END 2298 var lines =<< trim END
2299 var v = 10->((a) => 2299 var v = 10->((a) =>
2300 a 2300 a
2301 + 2 2301 + 2
2302 )() 2302 )()
2311 ->mapnew((_, v) => synIDattr(v, 'name'))->len()) 2311 ->mapnew((_, v) => synIDattr(v, 'name'))->len())
2312 END 2312 END
2313 CheckDefAndScriptSuccess(lines) 2313 CheckDefAndScriptSuccess(lines)
2314 enddef 2314 enddef
2315 2315
2316 def Test_expr7_funcref() 2316 def Test_expr8_funcref()
2317 var lines =<< trim END 2317 var lines =<< trim END
2318 def RetNumber(): number 2318 def RetNumber(): number
2319 return 123 2319 return 123
2320 enddef 2320 enddef
2321 var FuncRef = RetNumber 2321 var FuncRef = RetNumber
2348 enddef 2348 enddef
2349 2349
2350 let g:test_space_dict = {'': 'empty', ' ': 'space'} 2350 let g:test_space_dict = {'': 'empty', ' ': 'space'}
2351 let g:test_hash_dict = #{one: 1, two: 2} 2351 let g:test_hash_dict = #{one: 1, two: 2}
2352 2352
2353 def Test_expr7_dict() 2353 def Test_expr8_dict()
2354 # dictionary 2354 # dictionary
2355 var lines =<< trim END 2355 var lines =<< trim END
2356 assert_equal(g:dict_empty, {}) 2356 assert_equal(g:dict_empty, {})
2357 assert_equal(g:dict_empty, { }) 2357 assert_equal(g:dict_empty, { })
2358 assert_equal(g:dict_one, {['one']: 1}) 2358 assert_equal(g:dict_one, {['one']: 1})
2459 CheckDefFailure(['var x = ({'], 'E723:', 2) 2459 CheckDefFailure(['var x = ({'], 'E723:', 2)
2460 CheckScriptFailure(['vim9script', 'var x = ({'], 'E723:', 2) 2460 CheckScriptFailure(['vim9script', 'var x = ({'], 'E723:', 2)
2461 CheckDefExecAndScriptFailure(['{}[getftype("file")]'], 'E716: Key not present in Dictionary: ""', 1) 2461 CheckDefExecAndScriptFailure(['{}[getftype("file")]'], 'E716: Key not present in Dictionary: ""', 1)
2462 enddef 2462 enddef
2463 2463
2464 def Test_expr7_dict_vim9script() 2464 def Test_expr8_dict_vim9script()
2465 var lines =<< trim END 2465 var lines =<< trim END
2466 var d = { 2466 var d = {
2467 ['one']: 2467 ['one']:
2468 1, 2468 1,
2469 ['two']: 2, 2469 ['two']: 2,
2590 assert_equal({x: 99}, s:) 2590 assert_equal({x: 99}, s:)
2591 END 2591 END
2592 CheckScriptSuccess(lines) 2592 CheckScriptSuccess(lines)
2593 enddef 2593 enddef
2594 2594
2595 def Test_expr7_dict_in_block() 2595 def Test_expr8_dict_in_block()
2596 var lines =<< trim END 2596 var lines =<< trim END
2597 vim9script 2597 vim9script
2598 command MyCommand { 2598 command MyCommand {
2599 echo { 2599 echo {
2600 k: 0, } 2600 k: 0, }
2613 2613
2614 delcommand MyCommand 2614 delcommand MyCommand
2615 delcommand YourCommand 2615 delcommand YourCommand
2616 enddef 2616 enddef
2617 2617
2618 def Test_expr7_call_2bool() 2618 def Test_expr8_call_2bool()
2619 var lines =<< trim END 2619 var lines =<< trim END
2620 vim9script 2620 vim9script
2621 2621
2622 def BrokenCall(nr: number, mode: bool, use: string): void 2622 def BrokenCall(nr: number, mode: bool, use: string): void
2623 assert_equal(3, nr) 2623 assert_equal(3, nr)
2661 CheckDefAndScriptFailure(["var x = g:dict_one.#$!"], ['E1002:', 'E15:'], 1) 2661 CheckDefAndScriptFailure(["var x = g:dict_one.#$!"], ['E1002:', 'E15:'], 1)
2662 CheckDefExecAndScriptFailure(["var d: dict<any>", "echo d['a']"], 'E716:', 2) 2662 CheckDefExecAndScriptFailure(["var d: dict<any>", "echo d['a']"], 'E716:', 2)
2663 CheckDefExecAndScriptFailure(["var d: dict<number>", "d = g:list_empty"], 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2) 2663 CheckDefExecAndScriptFailure(["var d: dict<number>", "d = g:list_empty"], 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2)
2664 enddef 2664 enddef
2665 2665
2666 def Test_expr7_any_index_slice() 2666 def Test_expr8_any_index_slice()
2667 var lines =<< trim END 2667 var lines =<< trim END
2668 # getting the one member should clear the list only after getting the item 2668 # getting the one member should clear the list only after getting the item
2669 assert_equal('bbb', ['aaa', 'bbb', 'ccc'][1]) 2669 assert_equal('bbb', ['aaa', 'bbb', 'ccc'][1])
2670 2670
2671 # string is permissive, index out of range accepted 2671 # string is permissive, index out of range accepted
2815 2815
2816 def SetSomeVar() 2816 def SetSomeVar()
2817 b:someVar = &fdm 2817 b:someVar = &fdm
2818 enddef 2818 enddef
2819 2819
2820 def Test_expr7_option() 2820 def Test_expr8_option()
2821 var lines =<< trim END 2821 var lines =<< trim END
2822 # option 2822 # option
2823 set ts=11 2823 set ts=11
2824 assert_equal(11, &ts) 2824 assert_equal(11, &ts)
2825 &ts = 9 2825 &ts = 9
2842 unlet b:someVar 2842 unlet b:someVar
2843 END 2843 END
2844 CheckDefAndScriptSuccess(lines) 2844 CheckDefAndScriptSuccess(lines)
2845 enddef 2845 enddef
2846 2846
2847 def Test_expr7_environment() 2847 def Test_expr8_environment()
2848 var lines =<< trim END 2848 var lines =<< trim END
2849 # environment variable 2849 # environment variable
2850 assert_equal('testvar', $TESTVAR) 2850 assert_equal('testvar', $TESTVAR)
2851 assert_equal('', $ASDF_ASD_XXX) 2851 assert_equal('', $ASDF_ASD_XXX)
2852 END 2852 END
2854 2854
2855 CheckDefAndScriptFailure(["var x = $$$"], ['E1002:', 'E15:'], 1) 2855 CheckDefAndScriptFailure(["var x = $$$"], ['E1002:', 'E15:'], 1)
2856 CheckDefAndScriptFailure(["$"], ['E1002:', 'E15:'], 1) 2856 CheckDefAndScriptFailure(["$"], ['E1002:', 'E15:'], 1)
2857 enddef 2857 enddef
2858 2858
2859 def Test_expr7_register() 2859 def Test_expr8_register()
2860 var lines =<< trim END 2860 var lines =<< trim END
2861 @a = 'register a' 2861 @a = 'register a'
2862 assert_equal('register a', @a) 2862 assert_equal('register a', @a)
2863 2863
2864 var fname = expand('%') 2864 var fname = expand('%')
2880 2880
2881 CheckDefAndScriptFailure(["@. = 'yes'"], ['E354:', 'E488:'], 1) 2881 CheckDefAndScriptFailure(["@. = 'yes'"], ['E354:', 'E488:'], 1)
2882 enddef 2882 enddef
2883 2883
2884 " This is slow when run under valgrind. 2884 " This is slow when run under valgrind.
2885 def Test_expr7_namespace() 2885 def Test_expr8_namespace()
2886 var lines =<< trim END 2886 var lines =<< trim END
2887 g:some_var = 'some' 2887 g:some_var = 'some'
2888 assert_equal('some', get(g:, 'some_var')) 2888 assert_equal('some', get(g:, 'some_var'))
2889 assert_equal('some', get(g:, 'some_var', 'xxx')) 2889 assert_equal('some', get(g:, 'some_var', 'xxx'))
2890 assert_equal('xxx', get(g:, 'no_var', 'xxx')) 2890 assert_equal('xxx', get(g:, 'no_var', 'xxx'))
2909 unlet t:some_var 2909 unlet t:some_var
2910 END 2910 END
2911 CheckDefAndScriptSuccess(lines) 2911 CheckDefAndScriptSuccess(lines)
2912 enddef 2912 enddef
2913 2913
2914 def Test_expr7_namespace_loop_def() 2914 def Test_expr8_namespace_loop_def()
2915 var lines =<< trim END 2915 var lines =<< trim END
2916 # check using g: in a for loop more than DO_NOT_FREE_CNT times 2916 # check using g: in a for loop more than DO_NOT_FREE_CNT times
2917 var exists = 0 2917 var exists = 0
2918 var exists_not = 0 2918 var exists_not = 0
2919 for i in range(100000) 2919 for i in range(100000)
2928 END 2928 END
2929 CheckDefSuccess(lines) 2929 CheckDefSuccess(lines)
2930 enddef 2930 enddef
2931 2931
2932 " NOTE: this is known to be slow. To skip use: 2932 " NOTE: this is known to be slow. To skip use:
2933 " :let $TEST_SKIP_PAT = 'Test_expr7_namespace_loop_script' 2933 " :let $TEST_SKIP_PAT = 'Test_expr8_namespace_loop_script'
2934 def Test_expr7_namespace_loop_script() 2934 def Test_expr8_namespace_loop_script()
2935 var lines =<< trim END 2935 var lines =<< trim END
2936 vim9script 2936 vim9script
2937 # check using g: in a for loop more than DO_NOT_FREE_CNT times 2937 # check using g: in a for loop more than DO_NOT_FREE_CNT times
2938 var exists = 0 2938 var exists = 0
2939 var exists_not = 0 2939 var exists_not = 0
2948 assert_equal(100000, exists_not) 2948 assert_equal(100000, exists_not)
2949 END 2949 END
2950 CheckScriptSuccess(lines) 2950 CheckScriptSuccess(lines)
2951 enddef 2951 enddef
2952 2952
2953 def Test_expr7_parens() 2953 def Test_expr8_parens()
2954 # (expr) 2954 # (expr)
2955 var lines =<< trim END 2955 var lines =<< trim END
2956 assert_equal(4, (6 * 4) / 6) 2956 assert_equal(4, (6 * 4) / 6)
2957 assert_equal(0, 6 * ( 4 / 6 )) 2957 assert_equal(0, 6 * ( 4 / 6 ))
2958 2958
2980 assert_equal('onetwo', s) 2980 assert_equal('onetwo', s)
2981 END 2981 END
2982 CheckDefAndScriptSuccess(lines) 2982 CheckDefAndScriptSuccess(lines)
2983 enddef 2983 enddef
2984 2984
2985 def Test_expr7_negate_add() 2985 def Test_expr8_negate_add()
2986 var lines =<< trim END 2986 var lines =<< trim END
2987 assert_equal(-99, -99) 2987 assert_equal(-99, -99)
2988 assert_equal(-99, - 99) 2988 assert_equal(-99, - 99)
2989 assert_equal(99, +99) 2989 assert_equal(99, +99)
2990 2990
3029 3029
3030 def LegacyReturn(): string 3030 def LegacyReturn(): string
3031 legacy return #{key: 'ok'}.key 3031 legacy return #{key: 'ok'}.key
3032 enddef 3032 enddef
3033 3033
3034 def Test_expr7_legacy_script() 3034 def Test_expr8_legacy_script()
3035 var lines =<< trim END 3035 var lines =<< trim END
3036 let s:legacy = 'legacy' 3036 let s:legacy = 'legacy'
3037 def GetLocal(): string 3037 def GetLocal(): string
3038 return legacy 3038 return legacy
3039 enddef 3039 enddef
3063 3063
3064 def s:Echo4Arg(arg: any): string 3064 def s:Echo4Arg(arg: any): string
3065 return arg 3065 return arg
3066 enddef 3066 enddef
3067 3067
3068 def Test_expr7_call() 3068 def Test_expr8_call()
3069 var lines =<< trim END 3069 var lines =<< trim END
3070 assert_equal('yes', 'yes'->Echo()) 3070 assert_equal('yes', 'yes'->Echo())
3071 assert_equal(true, !range(5)->empty()) 3071 assert_equal(true, !range(5)->empty())
3072 assert_equal([0, 1, 2], 3->range()) 3072 assert_equal([0, 1, 2], 3->range())
3073 END 3073 END
3096 3096
3097 &rtp = save_rtp 3097 &rtp = save_rtp
3098 delete('Xruntime', 'rf') 3098 delete('Xruntime', 'rf')
3099 enddef 3099 enddef
3100 3100
3101 def Test_expr7_method_call() 3101 def Test_expr8_method_call()
3102 var lines =<< trim END 3102 var lines =<< trim END
3103 new 3103 new
3104 setline(1, ['first', 'last']) 3104 setline(1, ['first', 'last'])
3105 'second'->append(1) 3105 'second'->append(1)
3106 "third"->append(2) 3106 "third"->append(2)
3173 RetVoid()->byteidx(3) 3173 RetVoid()->byteidx(3)
3174 END 3174 END
3175 CheckDefExecFailure(lines, 'E1013:') 3175 CheckDefExecFailure(lines, 'E1013:')
3176 enddef 3176 enddef
3177 3177
3178 def Test_expr7_method_call_linebreak() 3178 def Test_expr8_method_call_linebreak()
3179 # this was giving an error when skipping over the expression 3179 # this was giving an error when skipping over the expression
3180 var lines =<< trim END 3180 var lines =<< trim END
3181 vim9script 3181 vim9script
3182 def Test() 3182 def Test()
3183 var a: dict<any> = {b: {}} 3183 var a: dict<any> = {b: {}}
3189 assert_equal('', v:errmsg) 3189 assert_equal('', v:errmsg)
3190 END 3190 END
3191 CheckScriptSuccess(lines) 3191 CheckScriptSuccess(lines)
3192 enddef 3192 enddef
3193 3193
3194 3194 def Test_expr8_method_call_import()
3195 def Test_expr7_not() 3195 var lines =<< trim END
3196 vim9script
3197 export def Square(items: list<number>): list<number>
3198 return map(items, (_, i) => i * i)
3199 enddef
3200 END
3201 call writefile(lines, 'Xsquare.vim')
3202
3203 lines =<< trim END
3204 vim9script
3205 import './Xsquare.vim'
3206
3207 def Test(): list<number>
3208 return range(5)
3209 ->Xsquare.Square()
3210 ->map((_, i) => i * 10)
3211 enddef
3212
3213 assert_equal([0, 10, 40, 90, 160], Test())
3214 END
3215 CheckScriptSuccess(lines)
3216
3217 delete('Xsquare.vim')
3218 enddef
3219
3220
3221 def Test_expr8_not()
3196 var lines =<< trim END 3222 var lines =<< trim END
3197 assert_equal(true, !'') 3223 assert_equal(true, !'')
3198 assert_equal(true, ![]) 3224 assert_equal(true, ![])
3199 assert_equal(false, !'asdf') 3225 assert_equal(false, !'asdf')
3200 assert_equal(false, ![2]) 3226 assert_equal(false, ![2])
3242 CheckDefAndScriptSuccess(lines) 3268 CheckDefAndScriptSuccess(lines)
3243 enddef 3269 enddef
3244 3270
3245 let g:anumber = 42 3271 let g:anumber = 42
3246 3272
3247 def Test_expr7_negate() 3273 def Test_expr8_negate()
3248 var lines =<< trim END 3274 var lines =<< trim END
3249 var nr = 1 3275 var nr = 1
3250 assert_equal(-1, -nr) 3276 assert_equal(-1, -nr)
3251 assert_equal(-42, -g:anumber) 3277 assert_equal(-42, -g:anumber)
3252 END 3278 END
3253 CheckDefAndScriptSuccess(lines) 3279 CheckDefAndScriptSuccess(lines)
3254 enddef 3280 enddef
3255 3281
3256 func Test_expr7_fails() 3282 func Test_expr8_fails()
3257 call CheckDefFailure(["var x = (12"], "E1097:", 3) 3283 call CheckDefFailure(["var x = (12"], "E1097:", 3)
3258 call CheckScriptFailure(['vim9script', "var x = (12"], 'E110:', 2) 3284 call CheckScriptFailure(['vim9script', "var x = (12"], 'E110:', 2)
3259 3285
3260 call CheckDefAndScriptFailure(["var x = -'xx'"], "E1030:", 1) 3286 call CheckDefAndScriptFailure(["var x = -'xx'"], "E1030:", 1)
3261 call CheckDefAndScriptFailure(["var x = +'xx'"], "E1030:", 1) 3287 call CheckDefAndScriptFailure(["var x = +'xx'"], "E1030:", 1)
3311 3337
3312 func CallMe2(one, two) 3338 func CallMe2(one, two)
3313 return a:one .. a:two 3339 return a:one .. a:two
3314 endfunc 3340 endfunc
3315 3341
3316 def Test_expr7_trailing() 3342 def Test_expr8_trailing()
3317 var lines =<< trim END 3343 var lines =<< trim END
3318 # user function call 3344 # user function call
3319 assert_equal(123, g:CallMe(123)) 3345 assert_equal(123, g:CallMe(123))
3320 assert_equal(123, g:CallMe( 123)) 3346 assert_equal(123, g:CallMe( 123))
3321 assert_equal(123, g:CallMe(123 )) 3347 assert_equal(123, g:CallMe(123 ))
3347 assert_equal(123, d.key) 3373 assert_equal(123, d.key)
3348 END 3374 END
3349 CheckDefAndScriptSuccess(lines) 3375 CheckDefAndScriptSuccess(lines)
3350 enddef 3376 enddef
3351 3377
3352 def Test_expr7_string_subscript() 3378 def Test_expr8_string_subscript()
3353 var lines =<< trim END 3379 var lines =<< trim END
3354 var text = 'abcdef' 3380 var text = 'abcdef'
3355 assert_equal('f', text[-1]) 3381 assert_equal('f', text[-1])
3356 assert_equal('a', text[0]) 3382 assert_equal('a', text[0])
3357 assert_equal('e', text[4]) 3383 assert_equal('e', text[4])
3446 echo d 3472 echo d
3447 END 3473 END
3448 CheckDefAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "2"'], 1) 3474 CheckDefAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "2"'], 1)
3449 enddef 3475 enddef
3450 3476
3451 def Test_expr7_list_subscript() 3477 def Test_expr8_list_subscript()
3452 var lines =<< trim END 3478 var lines =<< trim END
3453 var list = [0, 1, 2, 3, 4] 3479 var list = [0, 1, 2, 3, 4]
3454 assert_equal(0, list[0]) 3480 assert_equal(0, list[0])
3455 assert_equal(4, list[4]) 3481 assert_equal(4, list[4])
3456 assert_equal(4, list[-1]) 3482 assert_equal(4, list[-1])
3489 defcompile 3515 defcompile
3490 END 3516 END
3491 CheckDefAndScriptSuccess(lines) 3517 CheckDefAndScriptSuccess(lines)
3492 enddef 3518 enddef
3493 3519
3494 def Test_expr7_dict_subscript() 3520 def Test_expr8_dict_subscript()
3495 var lines =<< trim END 3521 var lines =<< trim END
3496 var l = [{lnum: 2}, {lnum: 1}] 3522 var l = [{lnum: 2}, {lnum: 1}]
3497 var res = l[0].lnum > l[1].lnum 3523 var res = l[0].lnum > l[1].lnum
3498 assert_true(res) 3524 assert_true(res)
3499 3525
3510 defcompile 3536 defcompile
3511 END 3537 END
3512 CheckDefAndScriptSuccess(lines) 3538 CheckDefAndScriptSuccess(lines)
3513 enddef 3539 enddef
3514 3540
3515 def Test_expr7_blob_subscript() 3541 def Test_expr8_blob_subscript()
3516 var lines =<< trim END 3542 var lines =<< trim END
3517 var b = 0z112233 3543 var b = 0z112233
3518 assert_equal(0x11, b[0]) 3544 assert_equal(0x11, b[0])
3519 assert_equal(0z112233, b[:]) 3545 assert_equal(0z112233, b[:])
3520 3546
3522 assert_equal(0z01ab, g:ablob[:]) 3548 assert_equal(0z01ab, g:ablob[:])
3523 END 3549 END
3524 CheckDefAndScriptSuccess(lines) 3550 CheckDefAndScriptSuccess(lines)
3525 enddef 3551 enddef
3526 3552
3527 def Test_expr7_subscript_linebreak() 3553 def Test_expr8_subscript_linebreak()
3528 var lines =<< trim END 3554 var lines =<< trim END
3529 var range = range( 3555 var range = range(
3530 3) 3556 3)
3531 var l = range 3557 var l = range
3532 ->mapnew('string(v:key)') 3558 ->mapnew('string(v:key)')
3565 one) 3591 one)
3566 END 3592 END
3567 CheckDefAndScriptFailure(lines, ['E1127:', 'E116:'], 2) 3593 CheckDefAndScriptFailure(lines, ['E1127:', 'E116:'], 2)
3568 enddef 3594 enddef
3569 3595
3570 func Test_expr7_trailing_fails() 3596 func Test_expr8_trailing_fails()
3571 call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8))'], 'E107:', 2) 3597 call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8))'], 'E107:', 2)
3572 call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8)) ()'], 'E274:', 2) 3598 call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8)) ()'], 'E274:', 2)
3573 endfunc 3599 endfunc
3574 3600
3575 func Test_expr_fails() 3601 func Test_expr_fails()