comparison src/testdir/test_vim9_assign.vim @ 27669:5c4ab8d4472c v8.2.4360

patch 8.2.4360: Vim9: allowing use of "s:" leads to inconsistencies Commit: https://github.com/vim/vim/commit/a749a42ed25534c88c636e5ab6603f1f97b857a4 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Feb 12 19:52:25 2022 +0000 patch 8.2.4360: Vim9: allowing use of "s:" leads to inconsistencies Problem: Vim9: allowing use of "s:" leads to inconsistencies. Solution: Disallow using "s:" in Vim9 script at the script level.
author Bram Moolenaar <Bram@vim.org>
date Sat, 12 Feb 2022 21:00:03 +0100
parents f40647a2b36a
children 4097434c7c67
comparison
equal deleted inserted replaced
27668:407a08328369 27669:5c4ab8d4472c
4 import './vim9.vim' as v9 4 import './vim9.vim' as v9
5 source term_util.vim 5 source term_util.vim
6 6
7 let s:appendToMe = 'xxx' 7 let s:appendToMe = 'xxx'
8 let s:addToMe = 111 8 let s:addToMe = 111
9 let s:newVar = ''
9 let g:existing = 'yes' 10 let g:existing = 'yes'
10 let g:inc_counter = 1 11 let g:inc_counter = 1
11 let $SOME_ENV_VAR = 'some' 12 let $SOME_ENV_VAR = 'some'
12 let g:alist = [7] 13 let g:alist = [7]
13 let g:adict = #{a: 1} 14 let g:adict = #{a: 1}
122 assert_equal('barfoo', $ENVVAR) 123 assert_equal('barfoo', $ENVVAR)
123 $ENVVAR = '' 124 $ENVVAR = ''
124 END 125 END
125 v9.CheckScriptSuccess(lines) 126 v9.CheckScriptSuccess(lines)
126 127
127 s:appendToMe ..= 'yyy' 128 appendToMe ..= 'yyy'
128 assert_equal('xxxyyy', s:appendToMe) 129 assert_equal('xxxyyy', appendToMe)
129 s:addToMe += 222 130 addToMe += 222
130 assert_equal(333, s:addToMe) 131 assert_equal(333, addToMe)
131 s:newVar = 'new' 132 newVar = 'new'
132 assert_equal('new', s:newVar) 133 assert_equal('new', newVar)
133 134
134 set ts=7 135 set ts=7
135 var ts: number = &ts 136 var ts: number = &ts
136 assert_equal(7, ts) 137 assert_equal(7, ts)
137 &ts += 1 138 &ts += 1
1193 1194
1194 var nr = 1234 | nr = 5678 1195 var nr = 1234 | nr = 5678
1195 assert_equal(5678, nr) 1196 assert_equal(5678, nr)
1196 enddef 1197 enddef
1197 1198
1198 let scriptvar = 'init' 1199 let s:scriptvar = 'init'
1199 1200
1200 def Test_assignment_var_list() 1201 def Test_assignment_var_list()
1201 var lines =<< trim END 1202 var lines =<< trim END
1202 var v1: string 1203 var v1: string
1203 var v2: string 1204 var v2: string
1241 assert_equal('error', v:errmsg) 1242 assert_equal('error', v:errmsg)
1242 unlet g:globalvar 1243 unlet g:globalvar
1243 END 1244 END
1244 v9.CheckDefAndScriptSuccess(lines) 1245 v9.CheckDefAndScriptSuccess(lines)
1245 1246
1246 [g:globalvar, s:scriptvar, b:bufvar] = ['global', 'script', 'buf'] 1247 [g:globalvar, scriptvar, b:bufvar] = ['global', 'script', 'buf']
1247 assert_equal('global', g:globalvar) 1248 assert_equal('global', g:globalvar)
1248 assert_equal('script', s:scriptvar) 1249 assert_equal('script', scriptvar)
1249 assert_equal('buf', b:bufvar) 1250 assert_equal('buf', b:bufvar)
1250 1251
1251 lines =<< trim END 1252 lines =<< trim END
1252 vim9script 1253 vim9script
1253 var s:scriptvar = 'init' 1254 var scriptvar = 'init'
1254 [g:globalvar, s:scriptvar, w:winvar] = ['global', 'script', 'win'] 1255 [g:globalvar, scriptvar, w:winvar] = ['global', 'script', 'win']
1255 assert_equal('global', g:globalvar) 1256 assert_equal('global', g:globalvar)
1256 assert_equal('script', s:scriptvar) 1257 assert_equal('script', scriptvar)
1257 assert_equal('win', w:winvar) 1258 assert_equal('win', w:winvar)
1258 END 1259 END
1259 v9.CheckScriptSuccess(lines) 1260 v9.CheckScriptSuccess(lines)
1260 enddef 1261 enddef
1261 1262
1396 v9.CheckDefFailure(['var xnr += 4'], 'E1020:', 1) 1397 v9.CheckDefFailure(['var xnr += 4'], 'E1020:', 1)
1397 v9.CheckScriptFailure(['vim9script', 'var xnr += 4'], 'E1020:') 1398 v9.CheckScriptFailure(['vim9script', 'var xnr += 4'], 'E1020:')
1398 v9.CheckDefFailure(["var xnr = xnr + 1"], 'E1001:', 1) 1399 v9.CheckDefFailure(["var xnr = xnr + 1"], 'E1001:', 1)
1399 v9.CheckScriptFailure(['vim9script', 'var xnr = xnr + 4'], 'E121:') 1400 v9.CheckScriptFailure(['vim9script', 'var xnr = xnr + 4'], 'E121:')
1400 1401
1401 v9.CheckScriptFailure(['vim9script', 'def Func()', 'var dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:') 1402 v9.CheckScriptFailure(['vim9script', 'def Func()', 'var dummy = notfound', 'enddef', 'defcompile'], 'E1001:')
1402 1403
1403 v9.CheckDefFailure(['var name: list<string> = [123]'], 'expected list<string> but got list<number>') 1404 v9.CheckDefFailure(['var name: list<string> = [123]'], 'expected list<string> but got list<number>')
1404 v9.CheckDefFailure(['var name: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 1405 v9.CheckDefFailure(['var name: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
1405 1406
1406 v9.CheckDefFailure(['var name: dict<string> = {key: 123}'], 'expected dict<string> but got dict<number>') 1407 v9.CheckDefFailure(['var name: dict<string> = {key: 123}'], 'expected dict<string> but got dict<number>')
1717 vim9script 1718 vim9script
1718 var name: string 1719 var name: string
1719 g:var_uninit = name 1720 g:var_uninit = name
1720 name = 'text' 1721 name = 'text'
1721 g:var_test = name 1722 g:var_test = name
1722 # prefixing s: is optional 1723 # prefixing s: is not allowed
1723 s:name = 'prefixed' 1724 name = 'prefixed'
1724 g:var_prefixed = s:name 1725 g:var_prefixed = name
1725 1726
1726 const FOO: number = 123 1727 const FOO: number = 123
1727 assert_equal(123, FOO) 1728 assert_equal(123, FOO)
1728 const FOOS = 'foos' 1729 const FOOS = 'foos'
1729 assert_equal('foos', FOOS) 1730 assert_equal('foos', FOOS)
1762 g:other_var = other 1763 g:other_var = other
1763 1764
1764 var xyz: string # comment 1765 var xyz: string # comment
1765 1766
1766 # type is inferred 1767 # type is inferred
1767 var s:dict = {['a']: 222} 1768 var dict = {['a']: 222}
1768 def GetDictVal(key: any) 1769 def GetDictVal(key: any)
1769 g:dict_val = s:dict[key] 1770 g:dict_val = dict[key]
1770 enddef 1771 enddef
1771 GetDictVal('a') 1772 GetDictVal('a')
1772 1773
1773 final adict: dict<string> = {} 1774 final adict: dict<string> = {}
1774 def ChangeAdict() 1775 def ChangeAdict()
1877 v9.CheckDefFailure(['var foo[3] = 2'], 'E1087:') 1878 v9.CheckDefFailure(['var foo[3] = 2'], 'E1087:')
1878 v9.CheckDefFailure(['const foo: number'], 'E1021:') 1879 v9.CheckDefFailure(['const foo: number'], 'E1021:')
1879 enddef 1880 enddef
1880 1881
1881 def Test_script_local_in_legacy() 1882 def Test_script_local_in_legacy()
1882 # OK to define script-local later when prefixed with s: 1883 # OK to define script-local later but before compiling
1883 var lines =<< trim END 1884 var lines =<< trim END
1884 def SetLater() 1885 def SetLater()
1885 s:legvar = 'two' 1886 legvar = 'two'
1886 enddef 1887 enddef
1888 let s:legvar = 'one'
1887 defcompile 1889 defcompile
1888 let s:legvar = 'one'
1889 call SetLater() 1890 call SetLater()
1890 call assert_equal('two', s:legvar) 1891 call assert_equal('two', s:legvar)
1891 END 1892 END
1892 v9.CheckScriptSuccess(lines) 1893 v9.CheckScriptSuccess(lines)
1893 1894
1900 call SetNoPrefix() 1901 call SetNoPrefix()
1901 call assert_equal('two', s:legvar) 1902 call assert_equal('two', s:legvar)
1902 END 1903 END
1903 v9.CheckScriptSuccess(lines) 1904 v9.CheckScriptSuccess(lines)
1904 1905
1905 # Not OK to leave out s: prefix when script-local defined later 1906 # Not OK to leave out s: prefix when script-local defined after compiling
1906 lines =<< trim END 1907 lines =<< trim END
1907 def SetLaterNoPrefix() 1908 def SetLaterNoPrefix()
1908 legvar = 'two' 1909 legvar = 'two'
1909 enddef 1910 enddef
1910 defcompile 1911 defcompile
1942 END 1943 END
1943 v9.CheckScriptFailure(lines, 'E1010:') 1944 v9.CheckScriptFailure(lines, 'E1010:')
1944 1945
1945 lines =<< trim END 1946 lines =<< trim END
1946 vim9script 1947 vim9script
1947 var s:l: list<number> 1948 var l: list<number>
1948 s:l = [] 1949 l = []
1949 END 1950 END
1950 v9.CheckScriptSuccess(lines) 1951 v9.CheckScriptSuccess(lines)
1951 1952
1952 lines =<< trim END 1953 lines =<< trim END
1953 vim9script 1954 vim9script
1954 var s:d: dict<number> 1955 var d: dict<number>
1955 s:d = {} 1956 d = {}
1956 END 1957 END
1957 v9.CheckScriptSuccess(lines) 1958 v9.CheckScriptSuccess(lines)
1958 1959
1959 lines =<< trim END 1960 lines =<< trim END
1960 vim9script 1961 vim9script
2122 ], 'E1081:') 2123 ], 'E1081:')
2123 v9.CheckScriptFailure([ 2124 v9.CheckScriptFailure([
2124 'vim9script', 2125 'vim9script',
2125 'var svar = 123', 2126 'var svar = 123',
2126 'unlet s:svar', 2127 'unlet s:svar',
2127 ], 'E1081:') 2128 ], 'E1268:')
2128 v9.CheckScriptFailure([ 2129 v9.CheckScriptFailure([
2129 'vim9script', 2130 'vim9script',
2130 'var svar = 123', 2131 'var svar = 123',
2131 'def Func()', 2132 'def Func()',
2132 ' unlet svar', 2133 ' unlet svar',
2265 END 2266 END
2266 v9.CheckDefAndScriptFailure(lines, 'E704:') 2267 v9.CheckDefAndScriptFailure(lines, 'E704:')
2267 2268
2268 lines =<< trim END 2269 lines =<< trim END
2269 vim9script 2270 vim9script
2270 var s:Len = (s: string): number => len(s) + 2 2271 var Len = (s: string): number => len(s) + 2
2271 assert_equal(6, Len('asdf')) 2272 assert_equal(6, Len('asdf'))
2272 END 2273 END
2273 v9.CheckScriptSuccess(lines) 2274 v9.CheckScriptSuccess(lines)
2274 2275
2275 lines =<< trim END 2276 lines =<< trim END
2276 vim9script 2277 vim9script
2277 var s:len = (s: string): number => len(s) + 1 2278 var len = (s: string): number => len(s) + 1
2278 END 2279 END
2279 v9.CheckScriptFailure(lines, 'E704:') 2280 v9.CheckScriptFailure(lines, 'E704:')
2280 enddef 2281 enddef
2281 2282
2282 def Test_script_funcref_runtime_type_check() 2283 def Test_script_funcref_runtime_type_check()