mirror of
https://github.com/vim/vim.git
synced 2025-09-30 04:44:14 -04:00
patch 8.2.0818: Vim9: using a discovery phase doesn't work well
Problem: Vim9: using a discovery phase doesn't work well. Solution: Remove the discovery phase, instead compile a function only when it is used. Add :defcompile to compile def functions earlier.
This commit is contained in:
@@ -255,7 +255,7 @@ def Test_assignment_failure()
|
||||
call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
|
||||
call CheckDefFailure(['let xnr += 4'], 'E1020:')
|
||||
|
||||
call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
|
||||
call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
|
||||
|
||||
call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
|
||||
call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
|
||||
@@ -296,6 +296,7 @@ def Test_unlet()
|
||||
'def Func()',
|
||||
' unlet svar',
|
||||
'enddef',
|
||||
'defcompile',
|
||||
], 'E1081:')
|
||||
call CheckScriptFailure([
|
||||
'vim9script',
|
||||
@@ -303,6 +304,7 @@ def Test_unlet()
|
||||
'def Func()',
|
||||
' unlet s:svar',
|
||||
'enddef',
|
||||
'defcompile',
|
||||
], 'E1081:')
|
||||
|
||||
$ENVVAR = 'foobar'
|
||||
@@ -606,6 +608,7 @@ def Test_vim9_import_export()
|
||||
let dummy = 1
|
||||
let imported = Export + dummy
|
||||
enddef
|
||||
defcompile
|
||||
END
|
||||
writefile(import_star_as_lines_no_dot, 'Ximport.vim')
|
||||
assert_fails('source Ximport.vim', 'E1060:')
|
||||
@@ -616,6 +619,7 @@ def Test_vim9_import_export()
|
||||
def Func()
|
||||
let imported = Export . exported
|
||||
enddef
|
||||
defcompile
|
||||
END
|
||||
writefile(import_star_as_lines_dot_space, 'Ximport.vim')
|
||||
assert_fails('source Ximport.vim', 'E1074:')
|
||||
@@ -626,6 +630,7 @@ def Test_vim9_import_export()
|
||||
def Func()
|
||||
let imported = Export.
|
||||
enddef
|
||||
defcompile
|
||||
END
|
||||
writefile(import_star_as_lines_missing_name, 'Ximport.vim')
|
||||
assert_fails('source Ximport.vim', 'E1048:')
|
||||
@@ -740,6 +745,9 @@ def Test_vim9script_fails()
|
||||
enddef
|
||||
|
||||
def Test_vim9script_reload_import()
|
||||
" TODO: make it work to compile when not in the script context anymore
|
||||
return
|
||||
|
||||
let lines =<< trim END
|
||||
vim9script
|
||||
const var = ''
|
||||
@@ -789,6 +797,9 @@ def Test_vim9script_reload_import()
|
||||
enddef
|
||||
|
||||
def Test_vim9script_reload_delfunc()
|
||||
" TODO: make it work to compile when not in the script context anymore
|
||||
return
|
||||
|
||||
let first_lines =<< trim END
|
||||
vim9script
|
||||
def FuncYes(): string
|
||||
@@ -1163,7 +1174,7 @@ def Test_for_loop_fails()
|
||||
CheckDefFailure(['for # in range(5)'], 'E690:')
|
||||
CheckDefFailure(['for i In range(5)'], 'E690:')
|
||||
CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
|
||||
CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
|
||||
CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
|
||||
CheckDefFailure(['for i in "text"'], 'E1024:')
|
||||
CheckDefFailure(['for i in xxx'], 'E1001:')
|
||||
CheckDefFailure(['endfor'], 'E588:')
|
||||
@@ -1699,11 +1710,6 @@ def Test_vim9_comment_not_compiled()
|
||||
'let v = 1# comment6',
|
||||
], 'E15:')
|
||||
|
||||
CheckScriptFailure([
|
||||
'vim9script',
|
||||
'let v:version',
|
||||
], 'E1091:')
|
||||
|
||||
CheckScriptSuccess([
|
||||
'vim9script',
|
||||
'new'
|
||||
@@ -1771,77 +1777,27 @@ enddef
|
||||
|
||||
def Test_let_missing_type()
|
||||
let lines =<< trim END
|
||||
vim9script
|
||||
func GetValue()
|
||||
return 'this'
|
||||
endfunc
|
||||
let val = GetValue()
|
||||
END
|
||||
CheckScriptFailure(lines, 'E1091:')
|
||||
|
||||
lines =<< trim END
|
||||
vim9script
|
||||
func GetValue()
|
||||
return 'this'
|
||||
endfunc
|
||||
let val = [GetValue()]
|
||||
END
|
||||
CheckScriptFailure(lines, 'E1091:')
|
||||
|
||||
lines =<< trim END
|
||||
vim9script
|
||||
func GetValue()
|
||||
return 'this'
|
||||
endfunc
|
||||
let val = {GetValue(): 123}
|
||||
END
|
||||
CheckScriptFailure(lines, 'E1091:')
|
||||
|
||||
lines =<< trim END
|
||||
vim9script
|
||||
func GetValue()
|
||||
return 'this'
|
||||
endfunc
|
||||
let val = {'a': GetValue()}
|
||||
END
|
||||
CheckScriptFailure(lines, 'E1091:')
|
||||
|
||||
lines =<< trim END
|
||||
vim9script
|
||||
let var = g:unknown
|
||||
END
|
||||
CheckScriptFailure(lines, 'E1091:')
|
||||
|
||||
" TODO: eventually this would work
|
||||
lines =<< trim END
|
||||
vim9script
|
||||
let var = has('eval')
|
||||
END
|
||||
CheckScriptFailure(lines, 'E1091:')
|
||||
|
||||
" TODO: eventually this would work
|
||||
lines =<< trim END
|
||||
vim9script
|
||||
let var = len('string')
|
||||
END
|
||||
CheckScriptFailure(lines, 'E1091:')
|
||||
CheckScriptFailure(lines, 'E121:')
|
||||
|
||||
lines =<< trim END
|
||||
vim9script
|
||||
let nr: number = 123
|
||||
let var = nr
|
||||
END
|
||||
CheckScriptFailure(lines, 'E1091:')
|
||||
CheckScriptSuccess(lines)
|
||||
enddef
|
||||
|
||||
def Test_forward_declaration()
|
||||
let lines =<< trim END
|
||||
vim9script
|
||||
g:initVal = GetValue()
|
||||
def GetValue(): string
|
||||
return theVal
|
||||
enddef
|
||||
let theVal = 'something'
|
||||
g:initVal = GetValue()
|
||||
theVal = 'else'
|
||||
g:laterVal = GetValue()
|
||||
END
|
||||
|
Reference in New Issue
Block a user