0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 8.2.1744: Vim9: using ":const!" is weird

Problem:    Vim9: using ":const!" is weird.
Solution:   Use "var" - "final" - "const" like Dart.  "let" still works for
            now.
This commit is contained in:
Bram Moolenaar
2020-09-26 15:09:30 +02:00
parent 273af497ca
commit 30fd8204ce
16 changed files with 512 additions and 382 deletions

View File

@@ -12,30 +12,30 @@ let g:alist = [7]
let g:astring = 'text'
def Test_assignment_bool()
let bool1: bool = true
var bool1: bool = true
assert_equal(v:true, bool1)
let bool2: bool = false
var bool2: bool = false
assert_equal(v:false, bool2)
let bool3: bool = 0
var bool3: bool = 0
assert_equal(false, bool3)
let bool4: bool = 1
var bool4: bool = 1
assert_equal(true, bool4)
let bool5: bool = 'yes' && 'no'
var bool5: bool = 'yes' && 'no'
assert_equal(true, bool5)
let bool6: bool = [] && 99
var bool6: bool = [] && 99
assert_equal(false, bool6)
let bool7: bool = [] || #{a: 1} && 99
var bool7: bool = [] || #{a: 1} && 99
assert_equal(true, bool7)
let lines =<< trim END
var lines =<< trim END
vim9script
def GetFlag(): bool
let flag: bool = 1
var flag: bool = 1
return flag
enddef
let flag: bool = GetFlag()
var flag: bool = GetFlag()
assert_equal(true, flag)
flag = 0
assert_equal(false, flag)
@@ -47,41 +47,42 @@ def Test_assignment_bool()
assert_equal(false, flag)
END
CheckScriptSuccess(lines)
CheckDefAndScriptFailure(['let x: bool = 2'], 'E1012:')
CheckDefAndScriptFailure(['let x: bool = -1'], 'E1012:')
CheckDefAndScriptFailure(['let x: bool = [1]'], 'E1012:')
CheckDefAndScriptFailure(['let x: bool = {}'], 'E1012:')
CheckDefAndScriptFailure(['let x: bool = "x"'], 'E1012:')
CheckDefAndScriptFailure(['var x: bool = 2'], 'E1012:')
CheckDefAndScriptFailure(['var x: bool = -1'], 'E1012:')
CheckDefAndScriptFailure(['var x: bool = [1]'], 'E1012:')
CheckDefAndScriptFailure(['var x: bool = {}'], 'E1012:')
CheckDefAndScriptFailure(['var x: bool = "x"'], 'E1012:')
enddef
def Test_syntax()
let var = 234
let other: list<string> = ['asdf']
var var = 234
var other: list<string> = ['asdf']
enddef
def Test_assignment()
CheckDefFailure(['let x:string'], 'E1069:')
CheckDefFailure(['let x:string = "x"'], 'E1069:')
CheckDefFailure(['let a:string = "x"'], 'E1069:')
CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
CheckDefFailure(['var x:string'], 'E1069:')
CheckDefFailure(['var x:string = "x"'], 'E1069:')
CheckDefFailure(['var a:string = "x"'], 'E1069:')
CheckDefFailure(['var lambda = {-> "lambda"}'], 'E704:')
CheckScriptFailure(['var x = "x"'], 'E1124:')
let nr: number = 1234
CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
var nr: number = 1234
CheckDefFailure(['var nr: number = "asdf"'], 'E1012:')
let a: number = 6 #comment
var a: number = 6 #comment
assert_equal(6, a)
if has('channel')
let chan1: channel
let job1: job
let job2: job = job_start('willfail')
var chan1: channel
var job1: job
var job2: job = job_start('willfail')
endif
if has('float')
let float1: float = 3.4
var float1: float = 3.4
endif
let Funky1: func
let Funky2: func = function('len')
let Party2: func = funcref('g:Test_syntax')
var Funky1: func
var Funky2: func = function('len')
var Party2: func = funcref('g:Test_syntax')
g:newvar = 'new' #comment
assert_equal('new', g:newvar)
@@ -97,7 +98,7 @@ def Test_assignment()
assert_equal('foobar', $ENVVAR)
$ENVVAR = ''
let lines =<< trim END
var lines =<< trim END
vim9script
$ENVVAR = 'barfoo'
assert_equal('barfoo', $ENVVAR)
@@ -126,15 +127,15 @@ def Test_assignment()
assert_equal(2, &ts)
if has('float')
let f100: float = 100.0
var f100: float = 100.0
f100 /= 5
assert_equal(20.0, f100)
let f200: float = 200.0
var f200: float = 200.0
f200 /= 5.0
assert_equal(40.0, f200)
CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
CheckDefFailure(['var nr: number = 200', 'nr /= 5.0'], 'E1012:')
endif
lines =<< trim END
@@ -163,11 +164,11 @@ def Test_assignment()
CheckDefFailure(['&path += 3'], 'E1012:')
CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
# test freeing ISN_STOREOPT
CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
CheckDefFailure(['&ts = 3', 'var asdf'], 'E1022:')
&ts = 8
lines =<< trim END
let save_TI = &t_TI
var save_TI = &t_TI
&t_TI = ''
assert_equal('', &t_TI)
&t_TI = 'xxx'
@@ -179,8 +180,8 @@ def Test_assignment()
CheckDefFailure(['&t_TI = 123'], 'E1012:')
CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
CheckDefFailure(['let s:var = 123'], 'E1101:')
CheckDefFailure(['let s:var: number'], 'E1101:')
CheckDefFailure(['var s:var = 123'], 'E1101:')
CheckDefFailure(['var s:var: number'], 'E1101:')
lines =<< trim END
vim9script
@@ -217,20 +218,20 @@ def Test_assignment()
# this should not leak
if 0
let text =<< trim END
var text =<< trim END
some text
END
endif
enddef
def Test_extend_list()
let lines =<< trim END
var lines =<< trim END
vim9script
let l: list<number>
var l: list<number>
l += [123]
assert_equal([123], l)
let d: dict<number>
var d: dict<number>
d['one'] = 1
assert_equal(#{one: 1}, d)
END
@@ -239,41 +240,41 @@ enddef
def Test_single_letter_vars()
# single letter variables
let a: number = 123
var a: number = 123
a = 123
assert_equal(123, a)
let b: number
var b: number
b = 123
assert_equal(123, b)
let g: number
var g: number
g = 123
assert_equal(123, g)
let s: number
var s: number
s = 123
assert_equal(123, s)
let t: number
var t: number
t = 123
assert_equal(123, t)
let v: number
var v: number
v = 123
assert_equal(123, v)
let w: number
var w: number
w = 123
assert_equal(123, w)
enddef
def Test_vim9_single_char_vars()
let lines =<< trim END
var lines =<< trim END
vim9script
# single character variable declarations work
let a: string
let b: number
let l: list<any>
let s: string
let t: number
let v: number
let w: number
var a: string
var b: number
var l: list<any>
var s: string
var t: number
var v: number
var w: number
# script-local variables can be used without s: prefix
a = 'script-a'
@@ -298,14 +299,14 @@ def Test_vim9_single_char_vars()
enddef
def Test_assignment_list()
let list1: list<bool> = [false, true, false]
let list2: list<number> = [1, 2, 3]
let list3: list<string> = ['sdf', 'asdf']
let list4: list<any> = ['yes', true, 1234]
let list5: list<blob> = [0z01, 0z02]
var list1: list<bool> = [false, true, false]
var list2: list<number> = [1, 2, 3]
var list3: list<string> = ['sdf', 'asdf']
var list4: list<any> = ['yes', true, 1234]
var list5: list<blob> = [0z01, 0z02]
let listS: list<string> = []
let listN: list<number> = []
var listS: list<string> = []
var listN: list<number> = []
assert_equal([1, 2, 3], list2)
list2[-1] = 99
@@ -320,19 +321,19 @@ def Test_assignment_list()
list3 += ['end']
assert_equal(['sdf', 'asdf', 'end'], list3)
CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
CheckDefExecFailure(['var ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
CheckDefExecFailure(['var [v1, v2] = [1, 2]'], 'E1092:')
# type becomes list<any>
let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
var somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
enddef
def Test_assignment_list_vim9script()
let lines =<< trim END
var lines =<< trim END
vim9script
let v1: number
let v2: number
let v3: number
var v1: number
var v2: number
var v3: number
[v1, v2, v3] = [1, 2, 3]
assert_equal([1, 2, 3], [v1, v2, v3])
END
@@ -340,27 +341,27 @@ def Test_assignment_list_vim9script()
enddef
def Test_assignment_dict()
let dict1: dict<bool> = #{one: false, two: true}
let dict2: dict<number> = #{one: 1, two: 2}
let dict3: dict<string> = #{key: 'value'}
let dict4: dict<any> = #{one: 1, two: '2'}
let dict5: dict<blob> = #{one: 0z01, two: 0z02}
var dict1: dict<bool> = #{one: false, two: true}
var dict2: dict<number> = #{one: 1, two: 2}
var dict3: dict<string> = #{key: 'value'}
var dict4: dict<any> = #{one: 1, two: '2'}
var dict5: dict<blob> = #{one: 0z01, two: 0z02}
# overwrite
dict3['key'] = 'another'
# empty key can be used
let dd = {}
var dd = {}
dd[""] = 6
assert_equal({'': 6}, dd)
# type becomes dict<any>
let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
var somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
# assignment to script-local dict
let lines =<< trim END
var lines =<< trim END
vim9script
let test: dict<any> = {}
var test: dict<any> = {}
def FillDict(): dict<any>
test['a'] = 43
return test
@@ -371,7 +372,7 @@ def Test_assignment_dict()
lines =<< trim END
vim9script
let test: dict<any>
var test: dict<any>
def FillDict(): dict<any>
test['a'] = 43
return test
@@ -408,7 +409,7 @@ enddef
def Test_assignment_local()
# Test in a separated file in order not to the current buffer/window/tab is
# changed.
let script_lines: list<string> =<< trim END
var script_lines: list<string> =<< trim END
let b:existing = 'yes'
let w:existing = 'yes'
let t:existing = 'yes'
@@ -446,37 +447,37 @@ enddef
def Test_assignment_default()
# Test default values.
let thebool: bool
var thebool: bool
assert_equal(v:false, thebool)
let thenumber: number
var thenumber: number
assert_equal(0, thenumber)
if has('float')
let thefloat: float
var thefloat: float
assert_equal(0.0, thefloat)
endif
let thestring: string
var thestring: string
assert_equal('', thestring)
let theblob: blob
var theblob: blob
assert_equal(0z, theblob)
let Thefunc: func
var Thefunc: func
assert_equal(test_null_function(), Thefunc)
let thelist: list<any>
var thelist: list<any>
assert_equal([], thelist)
let thedict: dict<any>
var thedict: dict<any>
assert_equal({}, thedict)
if has('channel')
let thejob: job
var thejob: job
assert_equal(test_null_job(), thejob)
let thechannel: channel
var thechannel: channel
assert_equal(test_null_channel(), thechannel)
if has('unix') && executable('cat')
@@ -487,14 +488,14 @@ def Test_assignment_default()
endif
endif
let nr = 1234 | nr = 5678
var nr = 1234 | nr = 5678
assert_equal(5678, nr)
enddef
def Test_assignment_var_list()
let v1: string
let v2: string
let vrem: list<string>
var v1: string
var v2: string
var vrem: list<string>
[v1] = ['aaa']
assert_equal('aaa', v1)
@@ -519,18 +520,18 @@ def Test_assignment_var_list()
enddef
def Test_assignment_vim9script()
let lines =<< trim END
var lines =<< trim END
vim9script
def Func(): list<number>
return [1, 2]
enddef
let var1: number
let var2: number
var var1: number
var var2: number
[var1, var2] =
Func()
assert_equal(1, var1)
assert_equal(2, var2)
let ll =
var ll =
Func()
assert_equal([1, 2], ll)
@@ -551,15 +552,15 @@ def Test_assignment_vim9script()
assert_equal('plus', @+)
endif
let a: number = 123
var a: number = 123
assert_equal(123, a)
let s: string = 'yes'
var s: string = 'yes'
assert_equal('yes', s)
let b: number = 42
var b: number = 42
assert_equal(42, b)
let w: number = 43
var w: number = 43
assert_equal(43, w)
let t: number = 44
var t: number = 44
assert_equal(44, t)
END
CheckScriptSuccess(lines)
@@ -571,80 +572,80 @@ def Mess(): string
enddef
def Test_assignment_failure()
CheckDefFailure(['let var=234'], 'E1004:')
CheckDefFailure(['let var =234'], 'E1004:')
CheckDefFailure(['let var= 234'], 'E1004:')
CheckDefFailure(['var var=234'], 'E1004:')
CheckDefFailure(['var var =234'], 'E1004:')
CheckDefFailure(['var var= 234'], 'E1004:')
CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
CheckScriptFailure(['vim9script', 'var var=234'], 'E1004:')
CheckScriptFailure(['vim9script', 'var var=234'], "before and after '='")
CheckScriptFailure(['vim9script', 'var var =234'], 'E1004:')
CheckScriptFailure(['vim9script', 'var var= 234'], 'E1004:')
CheckScriptFailure(['vim9script', 'var var = 234', 'var+=234'], 'E1004:')
CheckScriptFailure(['vim9script', 'var var = 234', 'var+=234'], "before and after '+='")
CheckScriptFailure(['vim9script', 'var var = "x"', 'var..="y"'], 'E1004:')
CheckScriptFailure(['vim9script', 'var var = "x"', 'var..="y"'], "before and after '..='")
CheckDefFailure(['let true = 1'], 'E1034:')
CheckDefFailure(['let false = 1'], 'E1034:')
CheckDefFailure(['var true = 1'], 'E1034:')
CheckDefFailure(['var false = 1'], 'E1034:')
CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
CheckDefExecFailure(['let a: number',
CheckDefExecFailure(['var a: number',
'[a] = test_null_list()'], 'E1093:')
CheckDefExecFailure(['let a: number',
CheckDefExecFailure(['var a: number',
'[a] = []'], 'E1093:')
CheckDefExecFailure(['let x: number',
'let y: number',
CheckDefExecFailure(['var x: number',
'var y: number',
'[x, y] = [1]'], 'E1093:')
CheckDefExecFailure(['let x: number',
'let y: number',
'let z: list<number>',
CheckDefExecFailure(['var x: number',
'var y: number',
'var z: list<number>',
'[x, y; z] = [1]'], 'E1093:')
CheckDefFailure(['let somevar'], "E1022:")
CheckDefFailure(['let &tabstop = 4'], 'E1052:')
CheckDefFailure(['var somevar'], "E1022:")
CheckDefFailure(['var &tabstop = 4'], 'E1052:')
CheckDefFailure(['&g:option = 5'], 'E113:')
CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
CheckScriptFailure(['vim9script', 'var &tabstop = 4'], 'E1052:')
CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
CheckDefFailure(['var $VAR = 5'], 'E1016: Cannot declare an environment variable:')
CheckScriptFailure(['vim9script', 'var $ENV = "xxx"'], 'E1016:')
if has('dnd')
CheckDefFailure(['let @~ = 5'], 'E1066:')
CheckDefFailure(['var @~ = 5'], 'E1066:')
else
CheckDefFailure(['let @~ = 5'], 'E354:')
CheckDefFailure(['var @~ = 5'], 'E354:')
CheckDefFailure(['@~ = 5'], 'E354:')
endif
CheckDefFailure(['let @a = 5'], 'E1066:')
CheckDefFailure(['let @/ = "x"'], 'E1066:')
CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
CheckDefFailure(['var @a = 5'], 'E1066:')
CheckDefFailure(['var @/ = "x"'], 'E1066:')
CheckScriptFailure(['vim9script', 'var @a = "abc"'], 'E1066:')
CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
CheckDefFailure(['var g:var = 5'], 'E1016: Cannot declare a global variable:')
CheckDefFailure(['var w:var = 5'], 'E1016: Cannot declare a window variable:')
CheckDefFailure(['var b:var = 5'], 'E1016: Cannot declare a buffer variable:')
CheckDefFailure(['var t:var = 5'], 'E1016: Cannot declare a tab variable:')
CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
CheckDefFailure(['var anr = 4', 'anr ..= "text"'], 'E1019:')
CheckDefFailure(['var xnr += 4'], 'E1020:', 1)
CheckScriptFailure(['vim9script', 'var xnr += 4'], 'E1020:')
CheckDefFailure(["var xnr = xnr + 1"], 'E1001:', 1)
CheckScriptFailure(['vim9script', 'var xnr = xnr + 4'], 'E121:')
CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
CheckScriptFailure(['vim9script', 'def Func()', 'var dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
CheckDefFailure(['var var: list<string> = [123]'], 'expected list<string> but got list<number>')
CheckDefFailure(['var var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
CheckDefFailure(['var var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
CheckDefFailure(['var var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
CheckDefFailure(['var var = feedkeys("0")'], 'E1031:')
CheckDefFailure(['var var: number = feedkeys("0")'], 'expected number but got void')
CheckDefFailure(['let var: dict <number>'], 'E1068:')
CheckDefFailure(['let var: dict<number'], 'E1009:')
CheckDefFailure(['var var: dict <number>'], 'E1068:')
CheckDefFailure(['var var: dict<number'], 'E1009:')
assert_fails('s/^/\=Mess()/n', 'E794:')
CheckDefFailure(['let var: dict<number'], 'E1009:')
CheckDefFailure(['var var: dict<number'], 'E1009:')
CheckDefFailure(['w:foo: number = 10'],
'E488: Trailing characters: : number = 1')
@@ -657,7 +658,7 @@ def Test_assignment_failure()
enddef
def Test_assign_list()
let l: list<string> = []
var l: list<string> = []
l[0] = 'value'
assert_equal('value', l[0])
@@ -667,7 +668,7 @@ def Test_assign_list()
assert_equal('asdf', l[-1])
assert_equal('value', l[-2])
let nrl: list<number> = []
var nrl: list<number> = []
for i in range(5)
nrl[i] = i
endfor
@@ -675,7 +676,7 @@ def Test_assign_list()
enddef
def Test_assign_dict()
let d: dict<string> = {}
var d: dict<string> = {}
d['key'] = 'value'
assert_equal('value', d['key'])
@@ -683,7 +684,7 @@ def Test_assign_dict()
assert_equal('qwerty', d[123])
assert_equal('qwerty', d['123'])
let nrd: dict<number> = {}
var nrd: dict<number> = {}
for i in range(3)
nrd[i] = i
endfor
@@ -691,12 +692,12 @@ def Test_assign_dict()
enddef
def Test_assign_dict_unknown_type()
let lines =<< trim END
var lines =<< trim END
vim9script
let mylist = []
var mylist = []
mylist += [#{one: 'one'}]
def Func()
let dd = mylist[0]
var dd = mylist[0]
assert_equal('one', dd.one)
enddef
Func()
@@ -706,10 +707,10 @@ def Test_assign_dict_unknown_type()
# doesn't work yet
#lines =<< trim END
# vim9script
# let mylist = [[]]
# var mylist = [[]]
# mylist[0] += [#{one: 'one'}]
# def Func()
# let dd = mylist[0][0]
# var dd = mylist[0][0]
# assert_equal('one', dd.one)
# enddef
# Func()
@@ -719,13 +720,13 @@ enddef
def Test_assign_lambda()
# check if assign a lambda to a variable which type is func or any.
let lines =<< trim END
var lines =<< trim END
vim9script
let FuncRef = {->123}
var FuncRef = {->123}
assert_equal(123, FuncRef())
let FuncRef_Func: func = {->123}
var FuncRef_Func: func = {->123}
assert_equal(123, FuncRef_Func())
let FuncRef_Any: any = {->123}
var FuncRef_Any: any = {->123}
assert_equal(123, FuncRef_Any())
END
CheckScriptSuccess(lines)