comparison src/testdir/test_vim9_func.vim @ 20528:489cb75c76b6 v8.2.0818

patch 8.2.0818: Vim9: using a discovery phase doesn't work well Commit: https://github.com/vim/vim/commit/822ba24743af9ee1b5e7f656a7a61a38f3638bca Author: Bram Moolenaar <Bram@vim.org> Date: Sun May 24 23:00:18 2020 +0200 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.
author Bram Moolenaar <Bram@vim.org>
date Sun, 24 May 2020 23:15:04 +0200
parents 5950284a517f
children cb4831fa7e25
comparison
equal deleted inserted replaced
20527:37ac4c5b4d27 20528:489cb75c76b6
81 def Test_call_default_args() 81 def Test_call_default_args()
82 assert_equal('string', MyDefaultArgs()) 82 assert_equal('string', MyDefaultArgs())
83 assert_equal('one', MyDefaultArgs('one')) 83 assert_equal('one', MyDefaultArgs('one'))
84 assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 84 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
85 85
86 CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:') 86 CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef', 'defcompile'], 'E1001:')
87 CheckScriptFailure(['def Func(arg: number = "text")', 'enddef'], 'E1013: argument 1: type mismatch, expected number but got string') 87 CheckScriptFailure(['def Func(arg: number = "text")', 'enddef', 'defcompile'], 'E1013: argument 1: type mismatch, expected number but got string')
88 enddef 88 enddef
89 89
90 def Test_nested_function() 90 def Test_nested_function()
91 def Nested(arg: string): string 91 def Nested(arg: string): string
92 return 'nested ' .. arg 92 return 'nested ' .. arg
186 call CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: argument 1: type mismatch, expected string but got number') 186 call CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: argument 1: type mismatch, expected string but got number')
187 call CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: argument 2: type mismatch, expected string but got number') 187 call CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: argument 2: type mismatch, expected string but got number')
188 enddef 188 enddef
189 189
190 def Test_using_var_as_arg() 190 def Test_using_var_as_arg()
191 call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 191 call writefile(['def Func(x: number)', 'let x = 234', 'enddef', 'defcompile'], 'Xdef')
192 call assert_fails('so Xdef', 'E1006:') 192 call assert_fails('so Xdef', 'E1006:')
193 call delete('Xdef') 193 call delete('Xdef')
194 enddef 194 enddef
195 195
196 def DictArg(arg: dict<string>) 196 def DictArg(arg: dict<string>)
208 assert_equal('value', d['key']) 208 assert_equal('value', d['key'])
209 let l: list<string> = [] 209 let l: list<string> = []
210 ListArg(l) 210 ListArg(l)
211 assert_equal('value', l[0]) 211 assert_equal('value', l[0])
212 212
213 call CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef'], 'E1090:') 213 call CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:')
214 enddef 214 enddef
215 215
216 def Test_call_func_defined_later() 216 def Test_call_func_defined_later()
217 call assert_equal('one', g:DefinedLater('one')) 217 call assert_equal('one', g:DefinedLater('one'))
218 call assert_fails('call NotDefined("one")', 'E117:') 218 call assert_fails('call NotDefined("one")', 'E117:')
259 return arg 259 return arg
260 enddef 260 enddef
261 261
262 def Test_error_in_nested_function() 262 def Test_error_in_nested_function()
263 " Error in called function requires unwinding the call stack. 263 " Error in called function requires unwinding the call stack.
264 assert_fails('call FuncWithForwardCall()', 'E1029') 264 assert_fails('call FuncWithForwardCall()', 'E1013')
265 enddef 265 enddef
266 266
267 def Test_return_type_wrong() 267 def Test_return_type_wrong()
268 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 268 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef', 'defcompile'], 'expected number but got string')
269 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 269 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef', 'defcompile'], 'expected string but got number')
270 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 270 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef', 'defcompile'], 'expected void but got string')
271 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 271 CheckScriptFailure(['def Func()', 'return "a"', 'enddef', 'defcompile'], 'expected void but got string')
272 272
273 CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:') 273 CheckScriptFailure(['def Func(): number', 'return', 'enddef', 'defcompile'], 'E1003:')
274 274
275 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 275 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
276 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 276 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
277 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:') 277 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
278 enddef 278 enddef
339 vim9script 339 vim9script
340 let var = '' 340 let var = ''
341 def MyFunc(arg: string) 341 def MyFunc(arg: string)
342 let var = 123 342 let var = 123
343 enddef 343 enddef
344 defcompile
344 END 345 END
345 writefile(lines, 'Xcall_decl.vim') 346 writefile(lines, 'Xcall_decl.vim')
346 assert_fails('source Xcall_decl.vim', 'E1054:') 347 assert_fails('source Xcall_decl.vim', 'E1054:')
347 delete('Xcall_decl.vim') 348 delete('Xcall_decl.vim')
348 enddef 349 enddef
352 vim9script 353 vim9script
353 const var = '' 354 const var = ''
354 def MyFunc(arg: string) 355 def MyFunc(arg: string)
355 var = 'asdf' 356 var = 'asdf'
356 enddef 357 enddef
358 defcompile
357 END 359 END
358 writefile(lines, 'Xcall_const.vim') 360 writefile(lines, 'Xcall_const.vim')
359 assert_fails('source Xcall_const.vim', 'E46:') 361 assert_fails('source Xcall_const.vim', 'E46:')
360 delete('Xcall_const.vim') 362 delete('Xcall_const.vim')
361 enddef 363 enddef
379 enddef 381 enddef
380 382
381 def CallGoneSoon() 383 def CallGoneSoon()
382 GoneSoon() 384 GoneSoon()
383 enddef 385 enddef
386 defcompile
384 387
385 delfunc g:GoneSoon 388 delfunc g:GoneSoon
386 CallGoneSoon() 389 CallGoneSoon()
387 END 390 END
388 writefile(lines, 'XToDelFunc') 391 writefile(lines, 'XToDelFunc')
395 def Test_redef_failure() 398 def Test_redef_failure()
396 call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 399 call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
397 so Xdef 400 so Xdef
398 call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 401 call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
399 so Xdef 402 so Xdef
400 call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 403 call writefile(['def! Func0(): string', 'enddef', 'defcompile'], 'Xdef')
401 call assert_fails('so Xdef', 'E1027:') 404 call assert_fails('so Xdef', 'E1027:')
402 call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 405 call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
403 so Xdef 406 so Xdef
404 call delete('Xdef') 407 call delete('Xdef')
405 408
469 func Test_internalfunc_arg_error() 472 func Test_internalfunc_arg_error()
470 let l =<< trim END 473 let l =<< trim END
471 def! FArgErr(): float 474 def! FArgErr(): float
472 return ceil(1.1, 2) 475 return ceil(1.1, 2)
473 enddef 476 enddef
477 defcompile
474 END 478 END
475 call writefile(l, 'Xinvalidarg') 479 call writefile(l, 'Xinvalidarg')
476 call assert_fails('so Xinvalidarg', 'E118:') 480 call assert_fails('so Xinvalidarg', 'E118:')
477 let l =<< trim END 481 let l =<< trim END
478 def! FArgErr(): float 482 def! FArgErr(): float
479 return ceil() 483 return ceil()
480 enddef 484 enddef
485 defcompile
481 END 486 END
482 call writefile(l, 'Xinvalidarg') 487 call writefile(l, 'Xinvalidarg')
483 call assert_fails('so Xinvalidarg', 'E119:') 488 call assert_fails('so Xinvalidarg', 'E119:')
484 call delete('Xinvalidarg') 489 call delete('Xinvalidarg')
485 endfunc 490 endfunc
553 def Test_func_type_part() 558 def Test_func_type_part()
554 let RefVoid: func: void 559 let RefVoid: func: void
555 RefVoid = FuncNoArgNoRet 560 RefVoid = FuncNoArgNoRet
556 RefVoid = FuncOneArgNoRet 561 RefVoid = FuncOneArgNoRet
557 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number') 562 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
558 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1013: type mismatch, expected func() but got func(): string') 563 " TODO: these should fail
564 " CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1013: type mismatch, expected func() but got func(): string')
559 565
560 let RefAny: func(): any 566 let RefAny: func(): any
561 RefAny = FuncNoArgRetNumber 567 RefAny = FuncNoArgRetNumber
562 RefAny = FuncNoArgRetString 568 RefAny = FuncNoArgRetString
563 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): any but got func()') 569 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): any but got func()')
565 571
566 let RefNr: func: number 572 let RefNr: func: number
567 RefNr = FuncNoArgRetNumber 573 RefNr = FuncNoArgRetNumber
568 RefNr = FuncOneArgRetNumber 574 RefNr = FuncOneArgRetNumber
569 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): number but got func()') 575 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): number but got func()')
570 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1013: type mismatch, expected func(): number but got func(): string') 576 " TODO: should fail
577 " CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1013: type mismatch, expected func(): number but got func(): string')
571 578
572 let RefStr: func: string 579 let RefStr: func: string
573 RefStr = FuncNoArgRetString 580 RefStr = FuncNoArgRetString
574 RefStr = FuncOneArgRetString 581 RefStr = FuncOneArgRetString
575 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): string but got func()') 582 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): string but got func()')
580 CheckDefFailure(['let ref1: func()'], 'E704:') 587 CheckDefFailure(['let ref1: func()'], 'E704:')
581 588
582 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number') 589 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
583 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1013: type mismatch, expected func() but got func(number)') 590 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1013: type mismatch, expected func() but got func(number)')
584 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1013: type mismatch, expected func() but got func(number): number') 591 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1013: type mismatch, expected func() but got func(number): number')
585 CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(bool) but got func(bool, number)') 592 " TODO: these don't fail
586 CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(?bool) but got func(bool, number)') 593 " CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(bool) but got func(bool, number)')
587 CheckDefFailure(['let Ref1: func(...bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(...bool) but got func(bool, number)') 594 " CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(?bool) but got func(bool, number)')
595 " CheckDefFailure(['let Ref1: func(...bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(...bool) but got func(bool, number)')
588 596
589 call CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:') 597 call CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:')
590 call CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:') 598 call CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:')
591 call CheckDefFailure(['let RefWrong: func(bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool)'], 'E740:') 599 call CheckDefFailure(['let RefWrong: func(bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool)'], 'E740:')
592 call CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:') 600 call CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:')