0
0
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:
Bram Moolenaar
2020-05-24 23:00:18 +02:00
parent f7271e8316
commit 822ba24743
19 changed files with 165 additions and 272 deletions

View File

@@ -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