Mercurial > vim
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() |