comparison src/testdir/test_vim9_func.vim @ 27457:4c16acb2525f v8.2.4257

patch 8.2.4257: Vim9: finding global function without g: prefix inconsistent Commit: https://github.com/vim/vim/commit/62aec93bfdb9e1b40d03a6d2e8e9511f8b1bdb2d Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 29 21:45:34 2022 +0000 patch 8.2.4257: Vim9: finding global function without g: prefix inconsistent Problem: Vim9: finding global function without g: prefix but not finding global variable is inconsistent. Solution: Require using g: for a global function. Change the vim9.vim script into a Vim9 script with exports. Fix that import in legacy script does not work.
author Bram Moolenaar <Bram@vim.org>
date Sat, 29 Jan 2022 23:00:05 +0100
parents 47dbeda35910
children a14c4d3e3260
comparison
equal deleted inserted replaced
27456:a8e2d91995ce 27457:4c16acb2525f
1 " Test various aspects of the Vim9 script language. 1 " Test various aspects of the Vim9 script language.
2 2
3 source check.vim 3 source check.vim
4 source term_util.vim 4 source term_util.vim
5 source view_util.vim 5 source view_util.vim
6 source vim9.vim 6 import './vim9.vim' as v9
7 source screendump.vim 7 source screendump.vim
8 8
9 func Test_def_basic() 9 func Test_def_basic()
10 def SomeFunc(): string 10 def SomeFunc(): string
11 return 'yes' 11 return 'yes'
28 echo nothing 28 echo nothing
29 enddef 29 enddef
30 defcompile 30 defcompile
31 END 31 END
32 writefile(lines, 'XTest_compile_error') 32 writefile(lines, 'XTest_compile_error')
33 var buf = RunVimInTerminal('-S XTest_compile_error', 33 var buf = g:RunVimInTerminal('-S XTest_compile_error',
34 {rows: 10, wait_for_ruler: 0}) 34 {rows: 10, wait_for_ruler: 0})
35 WaitForAssert(() => assert_match('Error detected while compiling command line.*Fails.*Variable not found: nothing', 35 g:WaitForAssert(() => assert_match('Error detected while compiling command line.*Fails.*Variable not found: nothing',
36 Term_getlines(buf, range(1, 9)))) 36 g:Term_getlines(buf, range(1, 9))))
37 37
38 # clean up 38 # clean up
39 StopVimInTerminal(buf) 39 g:StopVimInTerminal(buf)
40 delete('XTest_compile_error') 40 delete('XTest_compile_error')
41 enddef 41 enddef
42 42
43 def TestCompilingErrorInTry() 43 def TestCompilingErrorInTry()
44 var dir = 'Xdir/autoload' 44 var dir = 'Xdir/autoload'
62 endtry 62 endtry
63 END 63 END
64 lines[1] = 'set rtp=' .. getcwd() .. '/Xdir' 64 lines[1] = 'set rtp=' .. getcwd() .. '/Xdir'
65 writefile(lines, 'XTest_compile_error') 65 writefile(lines, 'XTest_compile_error')
66 66
67 var buf = RunVimInTerminal('-S XTest_compile_error', {rows: 10, wait_for_ruler: 0}) 67 var buf = g:RunVimInTerminal('-S XTest_compile_error', {rows: 10, wait_for_ruler: 0})
68 WaitForAssert(() => assert_match('Error detected while compiling command line.*function script#OnlyCompiled.*Invalid command: invalid', 68 g:WaitForAssert(() => assert_match('Error detected while compiling command line.*function script#OnlyCompiled.*Invalid command: invalid',
69 Term_getlines(buf, range(1, 9)))) 69 g:Term_getlines(buf, range(1, 9))))
70 70
71 # clean up 71 # clean up
72 StopVimInTerminal(buf) 72 g:StopVimInTerminal(buf)
73 delete('XTest_compile_error') 73 delete('XTest_compile_error')
74 delete('Xdir', 'rf') 74 delete('Xdir', 'rf')
75 enddef 75 enddef
76 76
77 def Test_compile_error_in_called_function() 77 def Test_compile_error_in_called_function()
85 Foo() 85 Foo()
86 enddef 86 enddef
87 silent! Foo() 87 silent! Foo()
88 Bar() 88 Bar()
89 END 89 END
90 CheckScriptFailureList(lines, ['E1012:', 'E1191:']) 90 v9.CheckScriptFailureList(lines, ['E1012:', 'E1191:'])
91 enddef 91 enddef
92 92
93 def Test_wrong_function_name() 93 def Test_wrong_function_name()
94 var lines =<< trim END 94 var lines =<< trim END
95 vim9script 95 vim9script
96 func _Foo() 96 func _Foo()
97 echo 'foo' 97 echo 'foo'
98 endfunc 98 endfunc
99 END 99 END
100 CheckScriptFailure(lines, 'E128:') 100 v9.CheckScriptFailure(lines, 'E128:')
101 101
102 lines =<< trim END 102 lines =<< trim END
103 vim9script 103 vim9script
104 def _Foo() 104 def _Foo()
105 echo 'foo' 105 echo 'foo'
106 enddef 106 enddef
107 END 107 END
108 CheckScriptFailure(lines, 'E128:') 108 v9.CheckScriptFailure(lines, 'E128:')
109 enddef 109 enddef
110 110
111 def Test_autoload_name_mismatch() 111 def Test_autoload_name_mismatch()
112 var dir = 'Xdir/autoload' 112 var dir = 'Xdir/autoload'
113 mkdir(dir, 'p') 113 mkdir(dir, 'p')
124 var save_rtp = &rtp 124 var save_rtp = &rtp
125 exe 'set rtp=' .. getcwd() .. '/Xdir' 125 exe 'set rtp=' .. getcwd() .. '/Xdir'
126 lines =<< trim END 126 lines =<< trim END
127 call script#Function() 127 call script#Function()
128 END 128 END
129 CheckScriptFailure(lines, 'E746:', 2) 129 v9.CheckScriptFailure(lines, 'E746:', 2)
130 130
131 &rtp = save_rtp 131 &rtp = save_rtp
132 delete(dir, 'rf') 132 delete(dir, 'rf')
133 enddef 133 enddef
134 134
152 var Function = foobar#function 152 var Function = foobar#function
153 assert_equal('yes', Function()) 153 assert_equal('yes', Function())
154 154
155 assert_equal('no', foobar#var) 155 assert_equal('no', foobar#var)
156 END 156 END
157 CheckDefAndScriptSuccess(lines) 157 v9.CheckDefAndScriptSuccess(lines)
158 158
159 &rtp = save_rtp 159 &rtp = save_rtp
160 delete(dir, 'rf') 160 delete(dir, 'rf')
161 enddef 161 enddef
162 162
177 177
178 g:called_function = 'no' 178 g:called_function = 'no'
179 # The error in the autoload script cannot be checked with assert_fails(), use 179 # The error in the autoload script cannot be checked with assert_fails(), use
180 # CheckDefSuccess() instead of CheckDefFailure() 180 # CheckDefSuccess() instead of CheckDefFailure()
181 try 181 try
182 CheckDefSuccess(['scripterror#function()']) 182 v9.CheckDefSuccess(['scripterror#function()'])
183 catch 183 catch
184 assert_match('E121: Undefined variable: 0', v:exception) 184 assert_match('E121: Undefined variable: 0', v:exception)
185 endtry 185 endtry
186 assert_equal('no', g:called_function) 186 assert_equal('no', g:called_function)
187 187
196 endtry 196 endtry
197 END 197 END
198 writefile(lines, dir .. '/scriptcaught.vim') 198 writefile(lines, dir .. '/scriptcaught.vim')
199 199
200 g:called_function = 'no' 200 g:called_function = 'no'
201 CheckDefSuccess(['scriptcaught#function()']) 201 v9.CheckDefSuccess(['scriptcaught#function()'])
202 assert_match('E121: Undefined variable: 0', g:caught) 202 assert_match('E121: Undefined variable: 0', g:caught)
203 assert_equal('yes', g:called_function) 203 assert_equal('yes', g:called_function)
204 204
205 &rtp = save_rtp 205 &rtp = save_rtp
206 delete(dir, 'rf') 206 delete(dir, 'rf')
207 enddef 207 enddef
208 208
209 def CallRecursive(n: number): number 209 def s:CallRecursive(n: number): number
210 return CallRecursive(n + 1) 210 return CallRecursive(n + 1)
211 enddef 211 enddef
212 212
213 def CallMapRecursive(l: list<number>): number 213 def s:CallMapRecursive(l: list<number>): number
214 return map(l, (_, v) => CallMapRecursive([v]))[0] 214 return map(l, (_, v) => CallMapRecursive([v]))[0]
215 enddef 215 enddef
216 216
217 def Test_funcdepth_error() 217 def Test_funcdepth_error()
218 set maxfuncdepth=10 218 set maxfuncdepth=10
241 def Test() 241 def Test()
242 echo 'test' 242 echo 'test'
243 endfunc 243 endfunc
244 enddef 244 enddef
245 END 245 END
246 CheckScriptFailure(lines, 'E1151:', 3) 246 v9.CheckScriptFailure(lines, 'E1151:', 3)
247 247
248 lines =<< trim END 248 lines =<< trim END
249 def Test() 249 def Test()
250 func Nested() 250 func Nested()
251 echo 'test' 251 echo 'test'
252 enddef 252 enddef
253 enddef 253 enddef
254 END 254 END
255 CheckScriptFailure(lines, 'E1152:', 4) 255 v9.CheckScriptFailure(lines, 'E1152:', 4)
256 256
257 lines =<< trim END 257 lines =<< trim END
258 def Ok() 258 def Ok()
259 echo 'hello' 259 echo 'hello'
260 enddef | echo 'there' 260 enddef | echo 'there'
261 def Bad() 261 def Bad()
262 echo 'hello' 262 echo 'hello'
263 enddef there 263 enddef there
264 END 264 END
265 CheckScriptFailure(lines, 'E1173: Text found after enddef: there', 6) 265 v9.CheckScriptFailure(lines, 'E1173: Text found after enddef: there', 6)
266 enddef 266 enddef
267 267
268 def Test_missing_endfunc_enddef() 268 def Test_missing_endfunc_enddef()
269 var lines =<< trim END 269 var lines =<< trim END
270 vim9script 270 vim9script
271 def Test() 271 def Test()
272 echo 'test' 272 echo 'test'
273 endef 273 endef
274 END 274 END
275 CheckScriptFailure(lines, 'E1057:', 2) 275 v9.CheckScriptFailure(lines, 'E1057:', 2)
276 276
277 lines =<< trim END 277 lines =<< trim END
278 vim9script 278 vim9script
279 func Some() 279 func Some()
280 echo 'test' 280 echo 'test'
281 enfffunc 281 enfffunc
282 END 282 END
283 CheckScriptFailure(lines, 'E126:', 2) 283 v9.CheckScriptFailure(lines, 'E126:', 2)
284 enddef 284 enddef
285 285
286 def Test_white_space_before_paren() 286 def Test_white_space_before_paren()
287 var lines =<< trim END 287 var lines =<< trim END
288 vim9script 288 vim9script
289 def Test () 289 def Test ()
290 echo 'test' 290 echo 'test'
291 enddef 291 enddef
292 END 292 END
293 CheckScriptFailure(lines, 'E1068:', 2) 293 v9.CheckScriptFailure(lines, 'E1068:', 2)
294 294
295 lines =<< trim END 295 lines =<< trim END
296 vim9script 296 vim9script
297 func Test () 297 func Test ()
298 echo 'test' 298 echo 'test'
299 endfunc 299 endfunc
300 END 300 END
301 CheckScriptFailure(lines, 'E1068:', 2) 301 v9.CheckScriptFailure(lines, 'E1068:', 2)
302 302
303 lines =<< trim END 303 lines =<< trim END
304 def Test () 304 def Test ()
305 echo 'test' 305 echo 'test'
306 enddef 306 enddef
307 END 307 END
308 CheckScriptFailure(lines, 'E1068:', 1) 308 v9.CheckScriptFailure(lines, 'E1068:', 1)
309 309
310 lines =<< trim END 310 lines =<< trim END
311 func Test () 311 func Test ()
312 echo 'test' 312 echo 'test'
313 endfunc 313 endfunc
314 END 314 END
315 CheckScriptSuccess(lines) 315 v9.CheckScriptSuccess(lines)
316 enddef 316 enddef
317 317
318 def Test_enddef_dict_key() 318 def Test_enddef_dict_key()
319 var d = { 319 var d = {
320 enddef: 'x', 320 enddef: 'x',
336 def ReturnGlobal(): number 336 def ReturnGlobal(): number
337 return g:notNumber 337 return g:notNumber
338 enddef 338 enddef
339 339
340 def Test_return_something() 340 def Test_return_something()
341 ReturnString()->assert_equal('string') 341 g:ReturnString()->assert_equal('string')
342 ReturnNumber()->assert_equal(123) 342 g:ReturnNumber()->assert_equal(123)
343 assert_fails('ReturnGlobal()', 'E1012: Type mismatch; expected number but got string', '', 1, 'ReturnGlobal') 343 assert_fails('ReturnGlobal()', 'E1012: Type mismatch; expected number but got string', '', 1, 'ReturnGlobal')
344 344
345 var lines =<< trim END 345 var lines =<< trim END
346 vim9script 346 vim9script
347 347
352 def Func() 352 def Func()
353 return Msg() 353 return Msg()
354 enddef 354 enddef
355 defcompile 355 defcompile
356 END 356 END
357 CheckScriptFailure(lines, 'E1096:') 357 v9.CheckScriptFailure(lines, 'E1096:')
358 enddef 358 enddef
359 359
360 def Test_check_argument_type() 360 def Test_check_argument_type()
361 var lines =<< trim END 361 var lines =<< trim END
362 vim9script 362 vim9script
368 Val(0, x) 368 Val(0, x)
369 enddef 369 enddef
370 disass Func 370 disass Func
371 Func() 371 Func()
372 END 372 END
373 CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got bool', 2) 373 v9.CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got bool', 2)
374 enddef 374 enddef
375 375
376 def Test_missing_return() 376 def Test_missing_return()
377 CheckDefFailure(['def Missing(): number', 377 v9.CheckDefFailure(['def Missing(): number',
378 ' if g:cond', 378 ' if g:cond',
379 ' echo "no return"', 379 ' echo "no return"',
380 ' else', 380 ' else',
381 ' return 0', 381 ' return 0',
382 ' endif' 382 ' endif'
383 'enddef'], 'E1027:') 383 'enddef'], 'E1027:')
384 CheckDefFailure(['def Missing(): number', 384 v9.CheckDefFailure(['def Missing(): number',
385 ' if g:cond', 385 ' if g:cond',
386 ' return 1', 386 ' return 1',
387 ' else', 387 ' else',
388 ' echo "no return"', 388 ' echo "no return"',
389 ' endif' 389 ' endif'
390 'enddef'], 'E1027:') 390 'enddef'], 'E1027:')
391 CheckDefFailure(['def Missing(): number', 391 v9.CheckDefFailure(['def Missing(): number',
392 ' if g:cond', 392 ' if g:cond',
393 ' return 1', 393 ' return 1',
394 ' else', 394 ' else',
395 ' return 2', 395 ' return 2',
396 ' endif' 396 ' endif'
407 def YesnoFilter(id: number, key: string): bool 407 def YesnoFilter(id: number, key: string): bool
408 return popup_filter_yesno(id, key) 408 return popup_filter_yesno(id, key)
409 enddef 409 enddef
410 defcompile 410 defcompile
411 END 411 END
412 CheckScriptSuccess(lines) 412 v9.CheckScriptSuccess(lines)
413 enddef 413 enddef
414 414
415 let s:nothing = 0 415 let s:nothing = 0
416 def ReturnNothing() 416 def ReturnNothing()
417 s:nothing = 1 417 s:nothing = 1
420 endif 420 endif
421 s:nothing = 2 421 s:nothing = 2
422 enddef 422 enddef
423 423
424 def Test_return_nothing() 424 def Test_return_nothing()
425 ReturnNothing() 425 g:ReturnNothing()
426 s:nothing->assert_equal(1) 426 s:nothing->assert_equal(1)
427 enddef 427 enddef
428 428
429 def Test_return_invalid() 429 def Test_return_invalid()
430 var lines =<< trim END 430 var lines =<< trim END
432 def Func(): invalid 432 def Func(): invalid
433 return xxx 433 return xxx
434 enddef 434 enddef
435 defcompile 435 defcompile
436 END 436 END
437 CheckScriptFailure(lines, 'E1010:', 2) 437 v9.CheckScriptFailure(lines, 'E1010:', 2)
438 438
439 lines =<< trim END 439 lines =<< trim END
440 vim9script 440 vim9script
441 def Test(Fun: func(number): number): list<number> 441 def Test(Fun: func(number): number): list<number>
442 return map([1, 2, 3], (_, i) => Fun(i)) 442 return map([1, 2, 3], (_, i) => Fun(i))
446 return nr + 2 446 return nr + 2
447 enddef 447 enddef
448 echo Test(Inc) 448 echo Test(Inc)
449 END 449 END
450 # doing this twice was leaking memory 450 # doing this twice was leaking memory
451 CheckScriptFailure(lines, 'E1010:') 451 v9.CheckScriptFailure(lines, 'E1010:')
452 CheckScriptFailure(lines, 'E1010:') 452 v9.CheckScriptFailure(lines, 'E1010:')
453 enddef 453 enddef
454 454
455 def Test_return_list_any() 455 def Test_return_list_any()
456 # This used to fail but now the actual list type is checked, and since it has 456 # This used to fail but now the actual list type is checked, and since it has
457 # an item of type string it can be used as list<string>. 457 # an item of type string it can be used as list<string>.
462 l->add('string') 462 l->add('string')
463 return l 463 return l
464 enddef 464 enddef
465 echo Func() 465 echo Func()
466 END 466 END
467 CheckScriptSuccess(lines) 467 v9.CheckScriptSuccess(lines)
468 468
469 lines =<< trim END 469 lines =<< trim END
470 vim9script 470 vim9script
471 def Func(): list<string> 471 def Func(): list<string>
472 var l: list<any> 472 var l: list<any>
473 l += ['string'] 473 l += ['string']
474 return l 474 return l
475 enddef 475 enddef
476 echo Func() 476 echo Func()
477 END 477 END
478 CheckScriptSuccess(lines) 478 v9.CheckScriptSuccess(lines)
479 enddef 479 enddef
480 480
481 func Increment() 481 func s:Increment()
482 let g:counter += 1 482 let g:counter += 1
483 endfunc 483 endfunc
484 484
485 def Test_call_ufunc_count() 485 def Test_call_ufunc_count()
486 g:counter = 1 486 g:counter = 1
491 g:counter->assert_equal(4) 491 g:counter->assert_equal(4)
492 eval g:counter->assert_equal(4) 492 eval g:counter->assert_equal(4)
493 unlet g:counter 493 unlet g:counter
494 enddef 494 enddef
495 495
496 def MyVarargs(arg: string, ...rest: list<string>): string 496 def s:MyVarargs(arg: string, ...rest: list<string>): string
497 var res = arg 497 var res = arg
498 for s in rest 498 for s in rest
499 res ..= ',' .. s 499 res ..= ',' .. s
500 endfor 500 endfor
501 return res 501 return res
506 MyVarargs('one', 'two')->assert_equal('one,two') 506 MyVarargs('one', 'two')->assert_equal('one,two')
507 MyVarargs('one', 'two', 'three')->assert_equal('one,two,three') 507 MyVarargs('one', 'two', 'three')->assert_equal('one,two,three')
508 enddef 508 enddef
509 509
510 def Test_call_white_space() 510 def Test_call_white_space()
511 CheckDefAndScriptFailure(["call Test ('text')"], ['E476:', 'E1068:']) 511 v9.CheckDefAndScriptFailure(["call Test ('text')"], ['E476:', 'E1068:'])
512 enddef 512 enddef
513 513
514 def MyDefaultArgs(name = 'string'): string 514 def MyDefaultArgs(name = 'string'): string
515 return name 515 return name
516 enddef 516 enddef
517 517
518 def MyDefaultSecond(name: string, second: bool = true): string 518 def s:MyDefaultSecond(name: string, second: bool = true): string
519 return second ? name : 'none' 519 return second ? name : 'none'
520 enddef 520 enddef
521 521
522 522
523 def Test_call_default_args() 523 def Test_call_default_args()
524 MyDefaultArgs()->assert_equal('string') 524 g:MyDefaultArgs()->assert_equal('string')
525 MyDefaultArgs(v:none)->assert_equal('string') 525 g:MyDefaultArgs(v:none)->assert_equal('string')
526 MyDefaultArgs('one')->assert_equal('one') 526 g:MyDefaultArgs('one')->assert_equal('one')
527 assert_fails('MyDefaultArgs("one", "two")', 'E118:', '', 4, 'Test_call_default_args') 527 assert_fails('g:MyDefaultArgs("one", "two")', 'E118:', '', 4, 'Test_call_default_args')
528 528
529 MyDefaultSecond('test')->assert_equal('test') 529 MyDefaultSecond('test')->assert_equal('test')
530 MyDefaultSecond('test', true)->assert_equal('test') 530 MyDefaultSecond('test', true)->assert_equal('test')
531 MyDefaultSecond('test', false)->assert_equal('none') 531 MyDefaultSecond('test', false)->assert_equal('none')
532 532
547 return mandatory .. optional 547 return mandatory .. optional
548 enddef 548 enddef
549 DefArg(1234)->assert_equal('12341234') 549 DefArg(1234)->assert_equal('12341234')
550 DefArg("ok")->assert_equal('okok') 550 DefArg("ok")->assert_equal('okok')
551 END 551 END
552 CheckDefAndScriptSuccess(lines) 552 v9.CheckDefAndScriptSuccess(lines)
553 553
554 CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef', 'defcompile'], 'E1001:') 554 v9.CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef', 'defcompile'], 'E1001:')
555 delfunc g:Func 555 delfunc g:Func
556 CheckScriptFailure(['def Func(arg: number = "text")', 'enddef', 'defcompile'], 'E1013: Argument 1: type mismatch, expected number but got string') 556 v9.CheckScriptFailure(['def Func(arg: number = "text")', 'enddef', 'defcompile'], 'E1013: Argument 1: type mismatch, expected number but got string')
557 delfunc g:Func 557 delfunc g:Func
558 CheckDefFailure(['def Func(x: number = )', 'enddef'], 'E15:') 558 v9.CheckDefFailure(['def Func(x: number = )', 'enddef'], 'E15:')
559 559
560 lines =<< trim END 560 lines =<< trim END
561 vim9script 561 vim9script
562 def Func(a = b == 0 ? 1 : 2, b = 0) 562 def Func(a = b == 0 ? 1 : 2, b = 0)
563 enddef 563 enddef
564 defcompile 564 defcompile
565 END 565 END
566 CheckScriptFailure(lines, 'E1001: Variable not found: b') 566 v9.CheckScriptFailure(lines, 'E1001: Variable not found: b')
567 567
568 # using script variable requires matching type or type cast when executed 568 # using script variable requires matching type or type cast when executed
569 lines =<< trim END 569 lines =<< trim END
570 vim9script 570 vim9script
571 var a: any 571 var a: any
572 def Func(arg: string = a) 572 def Func(arg: string = a)
573 echo arg 573 echo arg
574 enddef 574 enddef
575 defcompile 575 defcompile
576 END 576 END
577 CheckScriptSuccess(lines + ['a = "text"', 'Func()']) 577 v9.CheckScriptSuccess(lines + ['a = "text"', 'Func()'])
578 CheckScriptFailure(lines + ['a = 123', 'Func()'], 'E1013: Argument 1: type mismatch, expected string but got number') 578 v9.CheckScriptFailure(lines + ['a = 123', 'Func()'], 'E1013: Argument 1: type mismatch, expected string but got number')
579 579
580 # using global variable does not require type cast 580 # using global variable does not require type cast
581 lines =<< trim END 581 lines =<< trim END
582 vim9script 582 vim9script
583 def Func(arg: string = g:str) 583 def Func(arg: string = g:str)
584 echo arg 584 echo arg
585 enddef 585 enddef
586 g:str = 'works' 586 g:str = 'works'
587 Func() 587 Func()
588 END 588 END
589 CheckScriptSuccess(lines) 589 v9.CheckScriptSuccess(lines)
590 enddef 590 enddef
591 591
592 def FuncWithComment( # comment 592 def s:FuncWithComment( # comment
593 a: number, #comment 593 a: number, #comment
594 b: bool, # comment 594 b: bool, # comment
595 c: string) #comment 595 c: string) #comment
596 assert_equal(4, a) 596 assert_equal(4, a)
597 assert_equal(true, b) 597 assert_equal(true, b)
604 var lines =<< trim END 604 var lines =<< trim END
605 def Func(# comment 605 def Func(# comment
606 arg: string) 606 arg: string)
607 enddef 607 enddef
608 END 608 END
609 CheckScriptFailure(lines, 'E125:', 1) 609 v9.CheckScriptFailure(lines, 'E125:', 1)
610 610
611 lines =<< trim END 611 lines =<< trim END
612 def Func( 612 def Func(
613 arg: string# comment 613 arg: string# comment
614 ) 614 )
615 enddef 615 enddef
616 END 616 END
617 CheckScriptFailure(lines, 'E475:', 2) 617 v9.CheckScriptFailure(lines, 'E475:', 2)
618 618
619 lines =<< trim END 619 lines =<< trim END
620 def Func( 620 def Func(
621 arg: string 621 arg: string
622 )# comment 622 )# comment
623 enddef 623 enddef
624 END 624 END
625 CheckScriptFailure(lines, 'E488:', 3) 625 v9.CheckScriptFailure(lines, 'E488:', 3)
626 enddef 626 enddef
627 627
628 def Test_nested_function() 628 def Test_nested_function()
629 def NestedDef(arg: string): string 629 def NestedDef(arg: string): string
630 return 'nested ' .. arg 630 return 'nested ' .. arg
634 func NestedFunc(arg) 634 func NestedFunc(arg)
635 return 'nested ' .. a:arg 635 return 'nested ' .. a:arg
636 endfunc 636 endfunc
637 NestedFunc(':func')->assert_equal('nested :func') 637 NestedFunc(':func')->assert_equal('nested :func')
638 638
639 CheckDefFailure(['def Nested()', 'enddef', 'Nested(66)'], 'E118:') 639 v9.CheckDefFailure(['def Nested()', 'enddef', 'Nested(66)'], 'E118:')
640 CheckDefFailure(['def Nested(arg: string)', 'enddef', 'Nested()'], 'E119:') 640 v9.CheckDefFailure(['def Nested(arg: string)', 'enddef', 'Nested()'], 'E119:')
641 641
642 CheckDefFailure(['def s:Nested()', 'enddef'], 'E1075:') 642 v9.CheckDefFailure(['def s:Nested()', 'enddef'], 'E1075:')
643 CheckDefFailure(['def b:Nested()', 'enddef'], 'E1075:') 643 v9.CheckDefFailure(['def b:Nested()', 'enddef'], 'E1075:')
644 644
645 var lines =<< trim END 645 var lines =<< trim END
646 def Outer() 646 def Outer()
647 def Inner() 647 def Inner()
648 # comment 648 # comment
649 enddef 649 enddef
650 def Inner() 650 def Inner()
651 enddef 651 enddef
652 enddef 652 enddef
653 END 653 END
654 CheckDefFailure(lines, 'E1073:') 654 v9.CheckDefFailure(lines, 'E1073:')
655 655
656 lines =<< trim END 656 lines =<< trim END
657 def Outer() 657 def Outer()
658 def Inner() 658 def Inner()
659 # comment 659 # comment
660 enddef 660 enddef
661 def! Inner() 661 def! Inner()
662 enddef 662 enddef
663 enddef 663 enddef
664 END 664 END
665 CheckDefFailure(lines, 'E1117:') 665 v9.CheckDefFailure(lines, 'E1117:')
666 666
667 lines =<< trim END 667 lines =<< trim END
668 vim9script 668 vim9script
669 def Outer() 669 def Outer()
670 def Inner() 670 def Inner()
673 Inner() 673 Inner()
674 enddef 674 enddef
675 Outer() 675 Outer()
676 Inner() 676 Inner()
677 END 677 END
678 CheckScriptFailure(lines, 'E117: Unknown function: Inner') 678 v9.CheckScriptFailure(lines, 'E117: Unknown function: Inner')
679 assert_equal('ok', g:result) 679 assert_equal('ok', g:result)
680 unlet g:result 680 unlet g:result
681 681
682 # nested function inside conditional 682 # nested function inside conditional
683 lines =<< trim END 683 lines =<< trim END
694 endif 694 endif
695 defcompile 695 defcompile
696 assert_equal(1, Test()) 696 assert_equal(1, Test())
697 assert_equal(2, Test()) 697 assert_equal(2, Test())
698 END 698 END
699 CheckScriptSuccess(lines) 699 v9.CheckScriptSuccess(lines)
700 700
701 # also works when "thecount" is inside the "if" block 701 # also works when "thecount" is inside the "if" block
702 lines =<< trim END 702 lines =<< trim END
703 vim9script 703 vim9script
704 if true 704 if true
713 endif 713 endif
714 defcompile 714 defcompile
715 assert_equal(1, Test()) 715 assert_equal(1, Test())
716 assert_equal(2, Test()) 716 assert_equal(2, Test())
717 END 717 END
718 CheckScriptSuccess(lines) 718 v9.CheckScriptSuccess(lines)
719 719
720 lines =<< trim END 720 lines =<< trim END
721 vim9script 721 vim9script
722 def Outer() 722 def Outer()
723 def Inner() 723 def Inner()
724 echo 'hello' 724 echo 'hello'
725 enddef burp 725 enddef burp
726 enddef 726 enddef
727 defcompile 727 defcompile
728 END 728 END
729 CheckScriptFailure(lines, 'E1173: Text found after enddef: burp', 3) 729 v9.CheckScriptFailure(lines, 'E1173: Text found after enddef: burp', 3)
730 enddef 730 enddef
731 731
732 def Test_not_nested_function() 732 def Test_not_nested_function()
733 echo printf('%d', 733 echo printf('%d',
734 function('len')('xxx')) 734 function('len')('xxx'))
757 delfunc g:Inner 757 delfunc g:Inner
758 Outer() 758 Outer()
759 g:Inner()->assert_equal('inner') 759 g:Inner()->assert_equal('inner')
760 delfunc g:Inner 760 delfunc g:Inner
761 END 761 END
762 CheckScriptSuccess(lines) 762 v9.CheckScriptSuccess(lines)
763 763
764 lines =<< trim END 764 lines =<< trim END
765 vim9script 765 vim9script
766 def Outer() 766 def Outer()
767 func g:Inner() 767 func g:Inner()
777 delfunc g:Inner 777 delfunc g:Inner
778 Outer() 778 Outer()
779 g:Inner()->assert_equal('inner') 779 g:Inner()->assert_equal('inner')
780 delfunc g:Inner 780 delfunc g:Inner
781 END 781 END
782 CheckScriptSuccess(lines) 782 v9.CheckScriptSuccess(lines)
783 783
784 lines =<< trim END 784 lines =<< trim END
785 vim9script 785 vim9script
786 def Outer() 786 def Outer()
787 def g:Inner(): string 787 def g:Inner(): string
790 enddef 790 enddef
791 defcompile 791 defcompile
792 Outer() 792 Outer()
793 Outer() 793 Outer()
794 END 794 END
795 CheckScriptFailure(lines, "E122:") 795 v9.CheckScriptFailure(lines, "E122:")
796 delfunc g:Inner 796 delfunc g:Inner
797 797
798 lines =<< trim END 798 lines =<< trim END
799 vim9script 799 vim9script
800 def Outer() 800 def Outer()
803 enddef 803 enddef
804 g:Inner() 804 g:Inner()
805 enddef 805 enddef
806 Outer() 806 Outer()
807 END 807 END
808 CheckScriptSuccess(lines) 808 v9.CheckScriptSuccess(lines)
809 delfunc g:Inner 809 delfunc g:Inner
810 810
811 lines =<< trim END 811 lines =<< trim END
812 vim9script 812 vim9script
813 def Func() 813 def Func()
818 echo 'inner' 818 echo 'inner'
819 enddef 819 enddef
820 enddef 820 enddef
821 defcompile 821 defcompile
822 END 822 END
823 CheckScriptFailure(lines, "E1073:", 1) 823 v9.CheckScriptFailure(lines, "E1073:", 1)
824 824
825 lines =<< trim END 825 lines =<< trim END
826 vim9script 826 vim9script
827 def Func() 827 def Func()
828 echo 'script' 828 echo 'script'
829 enddef 829 enddef
830 def Func() 830 def Func()
831 echo 'script' 831 echo 'script'
832 enddef 832 enddef
833 END 833 END
834 CheckScriptFailure(lines, "E1073:", 5) 834 v9.CheckScriptFailure(lines, "E1073:", 5)
835 enddef 835 enddef
836 836
837 def DefListAll() 837 def DefListAll()
838 def 838 def
839 enddef 839 enddef
865 def Func() 865 def Func()
866 def +Func+ 866 def +Func+
867 enddef 867 enddef
868 defcompile 868 defcompile
869 END 869 END
870 CheckScriptFailure(lines, 'E476:', 1) 870 v9.CheckScriptFailure(lines, 'E476:', 1)
871 enddef 871 enddef
872 872
873 def Test_global_local_function() 873 def Test_global_local_function()
874 var lines =<< trim END 874 var lines =<< trim END
875 vim9script 875 vim9script
881 enddef 881 enddef
882 g:Func()->assert_equal('global') 882 g:Func()->assert_equal('global')
883 Func()->assert_equal('local') 883 Func()->assert_equal('local')
884 delfunc g:Func 884 delfunc g:Func
885 END 885 END
886 CheckScriptSuccess(lines) 886 v9.CheckScriptSuccess(lines)
887 887
888 lines =<< trim END 888 lines =<< trim END
889 vim9script 889 vim9script
890 def g:Funcy() 890 def g:Funcy()
891 echo 'funcy' 891 echo 'funcy'
892 enddef 892 enddef
893 s:Funcy() 893 s:Funcy()
894 END 894 END
895 CheckScriptFailure(lines, 'E117:') 895 v9.CheckScriptFailure(lines, 'E117:')
896 enddef 896 enddef
897 897
898 def Test_local_function_shadows_global() 898 def Test_local_function_shadows_global()
899 var lines =<< trim END 899 var lines =<< trim END
900 vim9script 900 vim9script
907 enddef 907 enddef
908 g:Gfunc()->assert_equal('global') 908 g:Gfunc()->assert_equal('global')
909 AnotherFunc()->assert_equal(7) 909 AnotherFunc()->assert_equal(7)
910 delfunc g:Gfunc 910 delfunc g:Gfunc
911 END 911 END
912 CheckScriptSuccess(lines) 912 v9.CheckScriptSuccess(lines)
913 913
914 lines =<< trim END 914 lines =<< trim END
915 vim9script 915 vim9script
916 def g:Func(): string 916 def g:Func(): string
917 return 'global' 917 return 'global'
919 def AnotherFunc() 919 def AnotherFunc()
920 g:Func = function('len') 920 g:Func = function('len')
921 enddef 921 enddef
922 AnotherFunc() 922 AnotherFunc()
923 END 923 END
924 CheckScriptFailure(lines, 'E705:') 924 v9.CheckScriptFailure(lines, 'E705:')
925 delfunc g:Func 925 delfunc g:Func
926 926
927 # global function is found without g: prefix 927 # global function is not found with g: prefix
928 lines =<< trim END 928 lines =<< trim END
929 vim9script 929 vim9script
930 def g:Func(): string 930 def g:Func(): string
931 return 'global' 931 return 'global'
932 enddef 932 enddef
933 def AnotherFunc(): string 933 def AnotherFunc(): string
934 return Func() 934 return Func()
935 enddef 935 enddef
936 assert_equal('global', AnotherFunc()) 936 assert_equal('global', AnotherFunc())
937 delfunc g:Func 937 END
938 END 938 v9.CheckScriptFailure(lines, 'E117:')
939 CheckScriptSuccess(lines) 939 delfunc g:Func
940 940
941 lines =<< trim END 941 lines =<< trim END
942 vim9script 942 vim9script
943 def g:Func(): string 943 def g:Func(): string
944 return 'global' 944 return 'global'
945 enddef 945 enddef
946 assert_equal('global', Func()) 946 assert_equal('global', Func())
947 delfunc g:Func 947 delfunc g:Func
948 END 948 END
949 CheckScriptSuccess(lines) 949 v9.CheckScriptSuccess(lines)
950 950
951 # This does not shadow "i" which is visible only inside the for loop 951 # This does not shadow "i" which is visible only inside the for loop
952 lines =<< trim END 952 lines =<< trim END
953 vim9script 953 vim9script
954 954
959 for i in range(3) 959 for i in range(3)
960 # Foo() is compiled here 960 # Foo() is compiled here
961 Foo(i) 961 Foo(i)
962 endfor 962 endfor
963 END 963 END
964 CheckScriptSuccess(lines) 964 v9.CheckScriptSuccess(lines)
965 enddef 965 enddef
966 966
967 func TakesOneArg(arg) 967 func TakesOneArg(arg)
968 echo a:arg 968 echo a:arg
969 endfunc 969 endfunc
970 970
971 def Test_call_wrong_args() 971 def Test_call_wrong_args()
972 CheckDefFailure(['TakesOneArg()'], 'E119:') 972 v9.CheckDefFailure(['g:TakesOneArg()'], 'E119:')
973 CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 973 v9.CheckDefFailure(['g:TakesOneArg(11, 22)'], 'E118:')
974 CheckDefFailure(['bufnr(xxx)'], 'E1001:') 974 v9.CheckDefFailure(['bufnr(xxx)'], 'E1001:')
975 CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:') 975 v9.CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
976 976
977 var lines =<< trim END 977 var lines =<< trim END
978 vim9script 978 vim9script
979 def Func(s: string) 979 def Func(s: string)
980 echo s 980 echo s
981 enddef 981 enddef
982 Func([]) 982 Func([])
983 END 983 END
984 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 5) 984 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 5)
985 985
986 # argument name declared earlier is found when declaring a function 986 # argument name declared earlier is found when declaring a function
987 lines =<< trim END 987 lines =<< trim END
988 vim9script 988 vim9script
989 var name = 'piet' 989 var name = 'piet'
990 def FuncOne(name: string) 990 def FuncOne(name: string)
991 echo nr 991 echo nr
992 enddef 992 enddef
993 END 993 END
994 CheckScriptFailure(lines, 'E1168:') 994 v9.CheckScriptFailure(lines, 'E1168:')
995 995
996 # argument name declared later is only found when compiling 996 # argument name declared later is only found when compiling
997 lines =<< trim END 997 lines =<< trim END
998 vim9script 998 vim9script
999 def FuncOne(name: string) 999 def FuncOne(name: string)
1000 echo nr 1000 echo nr
1001 enddef 1001 enddef
1002 var name = 'piet' 1002 var name = 'piet'
1003 END 1003 END
1004 CheckScriptSuccess(lines) 1004 v9.CheckScriptSuccess(lines)
1005 CheckScriptFailure(lines + ['defcompile'], 'E1168:') 1005 v9.CheckScriptFailure(lines + ['defcompile'], 'E1168:')
1006 1006
1007 lines =<< trim END 1007 lines =<< trim END
1008 vim9script 1008 vim9script
1009 def FuncOne(nr: number) 1009 def FuncOne(nr: number)
1010 echo nr 1010 echo nr
1060 END 1060 END
1061 var tail =<< trim END 1061 var tail =<< trim END
1062 enddef 1062 enddef
1063 Testme() 1063 Testme()
1064 END 1064 END
1065 CheckScriptSuccess(head + ["funcMap['func']('str', 123, [1, 2, 3])"] + tail) 1065 v9.CheckScriptSuccess(head + ["funcMap['func']('str', 123, [1, 2, 3])"] + tail)
1066 1066
1067 CheckScriptFailure(head + ["funcMap['func']('str', 123)"] + tail, 'E119:') 1067 v9.CheckScriptFailure(head + ["funcMap['func']('str', 123)"] + tail, 'E119:')
1068 CheckScriptFailure(head + ["funcMap['func']('str', 123, [1], 4)"] + tail, 'E118:') 1068 v9.CheckScriptFailure(head + ["funcMap['func']('str', 123, [1], 4)"] + tail, 'E118:')
1069 1069
1070 var lines =<< trim END 1070 var lines =<< trim END
1071 vim9script 1071 vim9script
1072 var Ref: func(number): any 1072 var Ref: func(number): any
1073 Ref = (j) => !j 1073 Ref = (j) => !j
1074 echo Ref(false) 1074 echo Ref(false)
1075 END 1075 END
1076 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got bool', 4) 1076 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got bool', 4)
1077 1077
1078 lines =<< trim END 1078 lines =<< trim END
1079 vim9script 1079 vim9script
1080 var Ref: func(number): any 1080 var Ref: func(number): any
1081 Ref = (j) => !j 1081 Ref = (j) => !j
1082 call Ref(false) 1082 call Ref(false)
1083 END 1083 END
1084 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got bool', 4) 1084 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got bool', 4)
1085 enddef 1085 enddef
1086 1086
1087 def Test_call_lambda_args() 1087 def Test_call_lambda_args()
1088 var lines =<< trim END 1088 var lines =<< trim END
1089 var Callback = (..._) => 'anything' 1089 var Callback = (..._) => 'anything'
1091 assert_equal('anything', Callback(1)) 1091 assert_equal('anything', Callback(1))
1092 assert_equal('anything', Callback('a', 2)) 1092 assert_equal('anything', Callback('a', 2))
1093 1093
1094 assert_equal('xyz', ((a: string): string => a)('xyz')) 1094 assert_equal('xyz', ((a: string): string => a)('xyz'))
1095 END 1095 END
1096 CheckDefAndScriptSuccess(lines) 1096 v9.CheckDefAndScriptSuccess(lines)
1097 1097
1098 CheckDefFailure(['echo ((i) => 0)()'], 1098 v9.CheckDefFailure(['echo ((i) => 0)()'],
1099 'E119: Not enough arguments for function: ((i) => 0)()') 1099 'E119: Not enough arguments for function: ((i) => 0)()')
1100 1100
1101 lines =<< trim END 1101 lines =<< trim END
1102 var Ref = (x: number, y: number) => x + y 1102 var Ref = (x: number, y: number) => x + y
1103 echo Ref(1, 'x') 1103 echo Ref(1, 'x')
1104 END 1104 END
1105 CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got string') 1105 v9.CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got string')
1106 1106
1107 lines =<< trim END 1107 lines =<< trim END
1108 var Ref: func(job, string, number) 1108 var Ref: func(job, string, number)
1109 Ref = (x, y) => 0 1109 Ref = (x, y) => 0
1110 END 1110 END
1111 CheckDefAndScriptFailure(lines, 'E1012:') 1111 v9.CheckDefAndScriptFailure(lines, 'E1012:')
1112 1112
1113 lines =<< trim END 1113 lines =<< trim END
1114 var Ref: func(job, string) 1114 var Ref: func(job, string)
1115 Ref = (x, y, z) => 0 1115 Ref = (x, y, z) => 0
1116 END 1116 END
1117 CheckDefAndScriptFailure(lines, 'E1012:') 1117 v9.CheckDefAndScriptFailure(lines, 'E1012:')
1118 1118
1119 lines =<< trim END 1119 lines =<< trim END
1120 var one = 1 1120 var one = 1
1121 var l = [1, 2, 3] 1121 var l = [1, 2, 3]
1122 echo map(l, (one) => one) 1122 echo map(l, (one) => one)
1123 END 1123 END
1124 CheckDefFailure(lines, 'E1167:') 1124 v9.CheckDefFailure(lines, 'E1167:')
1125 CheckScriptFailure(['vim9script'] + lines, 'E1168:') 1125 v9.CheckScriptFailure(['vim9script'] + lines, 'E1168:')
1126 1126
1127 lines =<< trim END 1127 lines =<< trim END
1128 var Ref: func(any, ?any): bool 1128 var Ref: func(any, ?any): bool
1129 Ref = (_, y = 1) => false 1129 Ref = (_, y = 1) => false
1130 END 1130 END
1131 CheckDefAndScriptFailure(lines, 'E1172:') 1131 v9.CheckDefAndScriptFailure(lines, 'E1172:')
1132 1132
1133 lines =<< trim END 1133 lines =<< trim END
1134 var a = 0 1134 var a = 0
1135 var b = (a == 0 ? 1 : 2) 1135 var b = (a == 0 ? 1 : 2)
1136 assert_equal(1, b) 1136 assert_equal(1, b)
1137 var txt = 'a' 1137 var txt = 'a'
1138 b = (txt =~ 'x' ? 1 : 2) 1138 b = (txt =~ 'x' ? 1 : 2)
1139 assert_equal(2, b) 1139 assert_equal(2, b)
1140 END 1140 END
1141 CheckDefAndScriptSuccess(lines) 1141 v9.CheckDefAndScriptSuccess(lines)
1142 1142
1143 lines =<< trim END 1143 lines =<< trim END
1144 def ShadowLocal() 1144 def ShadowLocal()
1145 var one = 1 1145 var one = 1
1146 var l = [1, 2, 3] 1146 var l = [1, 2, 3]
1147 echo map(l, (one) => one) 1147 echo map(l, (one) => one)
1148 enddef 1148 enddef
1149 END 1149 END
1150 CheckDefFailure(lines, 'E1167:') 1150 v9.CheckDefFailure(lines, 'E1167:')
1151 1151
1152 lines =<< trim END 1152 lines =<< trim END
1153 def Shadowarg(one: number) 1153 def Shadowarg(one: number)
1154 var l = [1, 2, 3] 1154 var l = [1, 2, 3]
1155 echo map(l, (one) => one) 1155 echo map(l, (one) => one)
1156 enddef 1156 enddef
1157 END 1157 END
1158 CheckDefFailure(lines, 'E1167:') 1158 v9.CheckDefFailure(lines, 'E1167:')
1159 1159
1160 lines =<< trim END 1160 lines =<< trim END
1161 echo ((a) => a)('aa', 'bb') 1161 echo ((a) => a)('aa', 'bb')
1162 END 1162 END
1163 CheckDefAndScriptFailure(lines, 'E118:', 1) 1163 v9.CheckDefAndScriptFailure(lines, 'E118:', 1)
1164 1164
1165 lines =<< trim END 1165 lines =<< trim END
1166 echo 'aa'->((a) => a)('bb') 1166 echo 'aa'->((a) => a)('bb')
1167 END 1167 END
1168 CheckDefFailure(lines, 'E118: Too many arguments for function: ->((a) => a)(''bb'')', 1) 1168 v9.CheckDefFailure(lines, 'E118: Too many arguments for function: ->((a) => a)(''bb'')', 1)
1169 CheckScriptFailure(['vim9script'] + lines, 'E118: Too many arguments for function: <lambda>', 2) 1169 v9.CheckScriptFailure(['vim9script'] + lines, 'E118: Too many arguments for function: <lambda>', 2)
1170 enddef 1170 enddef
1171 1171
1172 def Test_lambda_line_nr() 1172 def Test_lambda_line_nr()
1173 var lines =<< trim END 1173 var lines =<< trim END
1174 vim9script 1174 vim9script
1178 var out = execute('verbose ' .. timer_info(id)[0].callback 1178 var out = execute('verbose ' .. timer_info(id)[0].callback
1179 ->string() 1179 ->string()
1180 ->substitute("('\\|')", ' ', 'g')) 1180 ->substitute("('\\|')", ' ', 'g'))
1181 assert_match('Last set from .* line 4', out) 1181 assert_match('Last set from .* line 4', out)
1182 END 1182 END
1183 CheckScriptSuccess(lines) 1183 v9.CheckScriptSuccess(lines)
1184 enddef 1184 enddef
1185 1185
1186 def FilterWithCond(x: string, Cond: func(string): bool): bool 1186 def FilterWithCond(x: string, Cond: func(string): bool): bool
1187 return Cond(x) 1187 return Cond(x)
1188 enddef 1188 enddef
1189 1189
1190 def Test_lambda_return_type() 1190 def Test_lambda_return_type()
1191 var lines =<< trim END 1191 var lines =<< trim END
1192 var Ref = (): => 123 1192 var Ref = (): => 123
1193 END 1193 END
1194 CheckDefAndScriptFailure(lines, 'E1157:', 1) 1194 v9.CheckDefAndScriptFailure(lines, 'E1157:', 1)
1195 1195
1196 # no space before the return type 1196 # no space before the return type
1197 lines =<< trim END 1197 lines =<< trim END
1198 var Ref = (x):number => x + 1 1198 var Ref = (x):number => x + 1
1199 END 1199 END
1200 CheckDefAndScriptFailure(lines, 'E1069:', 1) 1200 v9.CheckDefAndScriptFailure(lines, 'E1069:', 1)
1201 1201
1202 # this works 1202 # this works
1203 for x in ['foo', 'boo'] 1203 for x in ['foo', 'boo']
1204 echo FilterWithCond(x, (v) => v =~ '^b') 1204 echo g:FilterWithCond(x, (v) => v =~ '^b')
1205 endfor 1205 endfor
1206 1206
1207 # this fails 1207 # this fails
1208 lines =<< trim END 1208 lines =<< trim END
1209 echo FilterWithCond('foo', (v) => v .. '^b') 1209 echo g:FilterWithCond('foo', (v) => v .. '^b')
1210 END 1210 END
1211 CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected func(string): bool but got func(any): string', 1) 1211 v9.CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected func(string): bool but got func(any): string', 1)
1212 1212
1213 lines =<< trim END 1213 lines =<< trim END
1214 var Lambda1 = (x) => { 1214 var Lambda1 = (x) => {
1215 return x 1215 return x
1216 } 1216 }
1218 var Lambda2 = (x): string => { 1218 var Lambda2 = (x): string => {
1219 return x 1219 return x
1220 } 1220 }
1221 assert_equal('foo', Lambda2('foo')) 1221 assert_equal('foo', Lambda2('foo'))
1222 END 1222 END
1223 CheckDefAndScriptSuccess(lines) 1223 v9.CheckDefAndScriptSuccess(lines)
1224 1224
1225 lines =<< trim END 1225 lines =<< trim END
1226 var Lambda = (x): string => { 1226 var Lambda = (x): string => {
1227 return x 1227 return x
1228 } 1228 }
1229 echo Lambda(['foo']) 1229 echo Lambda(['foo'])
1230 END 1230 END
1231 CheckDefExecAndScriptFailure(lines, 'E1012:') 1231 v9.CheckDefExecAndScriptFailure(lines, 'E1012:')
1232 enddef 1232 enddef
1233 1233
1234 def Test_lambda_uses_assigned_var() 1234 def Test_lambda_uses_assigned_var()
1235 CheckDefSuccess([ 1235 v9.CheckDefSuccess([
1236 'var x: any = "aaa"' 1236 'var x: any = "aaa"'
1237 'x = filter(["bbb"], (_, v) => v =~ x)']) 1237 'x = filter(["bbb"], (_, v) => v =~ x)'])
1238 enddef 1238 enddef
1239 1239
1240 def Test_pass_legacy_lambda_to_def_func() 1240 def Test_pass_legacy_lambda_to_def_func()
1245 endfunc 1245 endfunc
1246 def Bar(y: any) 1246 def Bar(y: any)
1247 enddef 1247 enddef
1248 Foo() 1248 Foo()
1249 END 1249 END
1250 CheckScriptSuccess(lines) 1250 v9.CheckScriptSuccess(lines)
1251 1251
1252 lines =<< trim END 1252 lines =<< trim END
1253 vim9script 1253 vim9script
1254 def g:TestFunc(f: func) 1254 def g:TestFunc(f: func)
1255 enddef 1255 enddef
1259 def g:TestFunc(f: func(number)) 1259 def g:TestFunc(f: func(number))
1260 enddef 1260 enddef
1261 legacy call g:TestFunc({nr -> 0}) 1261 legacy call g:TestFunc({nr -> 0})
1262 delfunc g:TestFunc 1262 delfunc g:TestFunc
1263 END 1263 END
1264 CheckScriptSuccess(lines) 1264 v9.CheckScriptSuccess(lines)
1265 enddef 1265 enddef
1266 1266
1267 def Test_lambda_in_reduce_line_break() 1267 def Test_lambda_in_reduce_line_break()
1268 # this was using freed memory 1268 # this was using freed memory
1269 var lines =<< trim END 1269 var lines =<< trim END
1279 return acc 1279 return acc
1280 endif 1280 endif
1281 }, {}) 1281 }, {})
1282 assert_equal({Bob: 2, Sam: 1, Cat: 3}, result) 1282 assert_equal({Bob: 2, Sam: 1, Cat: 3}, result)
1283 END 1283 END
1284 CheckScriptSuccess(lines) 1284 v9.CheckScriptSuccess(lines)
1285 enddef 1285 enddef
1286 1286
1287 def Test_set_opfunc_to_lambda() 1287 def Test_set_opfunc_to_lambda()
1288 var lines =<< trim END 1288 var lines =<< trim END
1289 vim9script 1289 vim9script
1301 'a b c d e'->setline(1) 1301 'a b c d e'->setline(1)
1302 feedkeys("\<F4>", 'x') 1302 feedkeys("\<F4>", 'x')
1303 assert_equal(4, g:result) 1303 assert_equal(4, g:result)
1304 bwipe! 1304 bwipe!
1305 END 1305 END
1306 CheckScriptSuccess(lines) 1306 v9.CheckScriptSuccess(lines)
1307 enddef 1307 enddef
1308 1308
1309 def Test_set_opfunc_to_global_function() 1309 def Test_set_opfunc_to_global_function()
1310 var lines =<< trim END 1310 var lines =<< trim END
1311 vim9script 1311 vim9script
1331 feedkeys("g@_", 'x') 1331 feedkeys("g@_", 'x')
1332 assert_equal(4, g:result) 1332 assert_equal(4, g:result)
1333 1333
1334 bwipe! 1334 bwipe!
1335 END 1335 END
1336 CheckScriptSuccess(lines) 1336 v9.CheckScriptSuccess(lines)
1337 &operatorfunc = '' 1337 &operatorfunc = ''
1338 enddef 1338 enddef
1339 1339
1340 def Test_use_script_func_name_with_prefix() 1340 def Test_use_script_func_name_with_prefix()
1341 var lines =<< trim END 1341 var lines =<< trim END
1344 return 'it' 1344 return 'it'
1345 endfunc 1345 endfunc
1346 var Fn = s:Getit 1346 var Fn = s:Getit
1347 assert_equal('it', Fn()) 1347 assert_equal('it', Fn())
1348 END 1348 END
1349 CheckScriptSuccess(lines) 1349 v9.CheckScriptSuccess(lines)
1350 enddef 1350 enddef
1351 1351
1352 def Test_lambda_type_allocated() 1352 def Test_lambda_type_allocated()
1353 # Check that unreferencing a partial using a lambda can use the variable type 1353 # Check that unreferencing a partial using a lambda can use the variable type
1354 # after the lambda has been freed and does not leak memory. 1354 # after the lambda has been freed and does not leak memory.
1363 &omnifunc = Lambda 1363 &omnifunc = Lambda
1364 Lambda = (a, b) => MyomniFunc1(20, a, b) 1364 Lambda = (a, b) => MyomniFunc1(20, a, b)
1365 &omnifunc = string(Lambda) 1365 &omnifunc = string(Lambda)
1366 Lambda = (a, b) => strlen(a) 1366 Lambda = (a, b) => strlen(a)
1367 END 1367 END
1368 CheckScriptSuccess(lines) 1368 v9.CheckScriptSuccess(lines)
1369 enddef 1369 enddef
1370 1370
1371 " Default arg and varargs 1371 " Default arg and varargs
1372 def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 1372 def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
1373 var res = one .. ',' .. two 1373 var res = one .. ',' .. two
1376 endfor 1376 endfor
1377 return res 1377 return res
1378 enddef 1378 enddef
1379 1379
1380 def Test_call_def_varargs() 1380 def Test_call_def_varargs()
1381 assert_fails('MyDefVarargs()', 'E119:', '', 1, 'Test_call_def_varargs') 1381 assert_fails('g:MyDefVarargs()', 'E119:', '', 1, 'Test_call_def_varargs')
1382 MyDefVarargs('one')->assert_equal('one,foo') 1382 g:MyDefVarargs('one')->assert_equal('one,foo')
1383 MyDefVarargs('one', 'two')->assert_equal('one,two') 1383 g:MyDefVarargs('one', 'two')->assert_equal('one,two')
1384 MyDefVarargs('one', 'two', 'three')->assert_equal('one,two,three') 1384 g:MyDefVarargs('one', 'two', 'three')->assert_equal('one,two,three')
1385 CheckDefFailure(['MyDefVarargs("one", 22)'], 1385 v9.CheckDefFailure(['g:MyDefVarargs("one", 22)'],
1386 'E1013: Argument 2: type mismatch, expected string but got number') 1386 'E1013: Argument 2: type mismatch, expected string but got number')
1387 CheckDefFailure(['MyDefVarargs("one", "two", 123)'], 1387 v9.CheckDefFailure(['g:MyDefVarargs("one", "two", 123)'],
1388 'E1013: Argument 3: type mismatch, expected string but got number') 1388 'E1013: Argument 3: type mismatch, expected string but got number')
1389 1389
1390 var lines =<< trim END 1390 var lines =<< trim END
1391 vim9script 1391 vim9script
1392 def Func(...l: list<string>) 1392 def Func(...l: list<string>)
1393 echo l 1393 echo l
1394 enddef 1394 enddef
1395 Func('a', 'b', 'c') 1395 Func('a', 'b', 'c')
1396 END 1396 END
1397 CheckScriptSuccess(lines) 1397 v9.CheckScriptSuccess(lines)
1398 1398
1399 lines =<< trim END 1399 lines =<< trim END
1400 vim9script 1400 vim9script
1401 def Func(...l: list<string>) 1401 def Func(...l: list<string>)
1402 echo l 1402 echo l
1403 enddef 1403 enddef
1404 Func() 1404 Func()
1405 END 1405 END
1406 CheckScriptSuccess(lines) 1406 v9.CheckScriptSuccess(lines)
1407 1407
1408 lines =<< trim END 1408 lines =<< trim END
1409 vim9script 1409 vim9script
1410 def Func(...l: list<any>) 1410 def Func(...l: list<any>)
1411 echo l 1411 echo l
1412 enddef 1412 enddef
1413 Func(0) 1413 Func(0)
1414 END 1414 END
1415 CheckScriptSuccess(lines) 1415 v9.CheckScriptSuccess(lines)
1416 1416
1417 lines =<< trim END 1417 lines =<< trim END
1418 vim9script 1418 vim9script
1419 def Func(...l: any) 1419 def Func(...l: any)
1420 echo l 1420 echo l
1421 enddef 1421 enddef
1422 Func(0) 1422 Func(0)
1423 END 1423 END
1424 CheckScriptFailure(lines, 'E1180:', 2) 1424 v9.CheckScriptFailure(lines, 'E1180:', 2)
1425 1425
1426 lines =<< trim END 1426 lines =<< trim END
1427 vim9script 1427 vim9script
1428 def Func(..._l: list<string>) 1428 def Func(..._l: list<string>)
1429 echo _l 1429 echo _l
1430 enddef 1430 enddef
1431 Func('a', 'b', 'c') 1431 Func('a', 'b', 'c')
1432 END 1432 END
1433 CheckScriptSuccess(lines) 1433 v9.CheckScriptSuccess(lines)
1434 1434
1435 lines =<< trim END 1435 lines =<< trim END
1436 vim9script 1436 vim9script
1437 def Func(...l: list<string>) 1437 def Func(...l: list<string>)
1438 echo l 1438 echo l
1439 enddef 1439 enddef
1440 Func(1, 2, 3) 1440 Func(1, 2, 3)
1441 END 1441 END
1442 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch') 1442 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch')
1443 1443
1444 lines =<< trim END 1444 lines =<< trim END
1445 vim9script 1445 vim9script
1446 def Func(...l: list<string>) 1446 def Func(...l: list<string>)
1447 echo l 1447 echo l
1448 enddef 1448 enddef
1449 Func('a', 9) 1449 Func('a', 9)
1450 END 1450 END
1451 CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch') 1451 v9.CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch')
1452 1452
1453 lines =<< trim END 1453 lines =<< trim END
1454 vim9script 1454 vim9script
1455 def Func(...l: list<string>) 1455 def Func(...l: list<string>)
1456 echo l 1456 echo l
1457 enddef 1457 enddef
1458 Func(1, 'a') 1458 Func(1, 'a')
1459 END 1459 END
1460 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch') 1460 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch')
1461 1461
1462 lines =<< trim END 1462 lines =<< trim END
1463 vim9script 1463 vim9script
1464 def Func( # some comment 1464 def Func( # some comment
1465 ...l = [] 1465 ...l = []
1466 ) 1466 )
1467 echo l 1467 echo l
1468 enddef 1468 enddef
1469 END 1469 END
1470 CheckScriptFailure(lines, 'E1160:') 1470 v9.CheckScriptFailure(lines, 'E1160:')
1471 1471
1472 lines =<< trim END 1472 lines =<< trim END
1473 vim9script 1473 vim9script
1474 def DoIt() 1474 def DoIt()
1475 g:Later('') 1475 g:Later('')
1477 defcompile 1477 defcompile
1478 def g:Later(...l: list<number>) 1478 def g:Later(...l: list<number>)
1479 enddef 1479 enddef
1480 DoIt() 1480 DoIt()
1481 END 1481 END
1482 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got string') 1482 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got string')
1483 enddef 1483 enddef
1484 1484
1485 let s:value = '' 1485 let s:value = ''
1486 1486
1487 def FuncOneDefArg(opt = 'text') 1487 def FuncOneDefArg(opt = 'text')
1508 RefDef2Arg = FuncTwoDefArg 1508 RefDef2Arg = FuncTwoDefArg
1509 RefDef2Arg()->assert_equal('123text') 1509 RefDef2Arg()->assert_equal('123text')
1510 RefDef2Arg(99)->assert_equal('99text') 1510 RefDef2Arg(99)->assert_equal('99text')
1511 RefDef2Arg(77, 'some')->assert_equal('77some') 1511 RefDef2Arg(77, 'some')->assert_equal('77some')
1512 1512
1513 CheckDefFailure(['var RefWrong: func(string?)'], 'E1010:') 1513 v9.CheckDefFailure(['var RefWrong: func(string?)'], 'E1010:')
1514 CheckDefFailure(['var RefWrong: func(?string, string)'], 'E1007:') 1514 v9.CheckDefFailure(['var RefWrong: func(?string, string)'], 'E1007:')
1515 1515
1516 var RefVarargs: func(...list<string>): string 1516 var RefVarargs: func(...list<string>): string
1517 RefVarargs = FuncVarargs 1517 RefVarargs = FuncVarargs
1518 RefVarargs()->assert_equal('') 1518 RefVarargs()->assert_equal('')
1519 RefVarargs('one')->assert_equal('one') 1519 RefVarargs('one')->assert_equal('one')
1520 RefVarargs('one', 'two')->assert_equal('one,two') 1520 RefVarargs('one', 'two')->assert_equal('one,two')
1521 1521
1522 CheckDefFailure(['var RefWrong: func(...list<string>, string)'], 'E110:') 1522 v9.CheckDefFailure(['var RefWrong: func(...list<string>, string)'], 'E110:')
1523 CheckDefFailure(['var RefWrong: func(...list<string>, ?string)'], 'E110:') 1523 v9.CheckDefFailure(['var RefWrong: func(...list<string>, ?string)'], 'E110:')
1524 enddef 1524 enddef
1525 1525
1526 " Only varargs 1526 " Only varargs
1527 def MyVarargsOnly(...args: list<string>): string 1527 def MyVarargsOnly(...args: list<string>): string
1528 return join(args, ',') 1528 return join(args, ',')
1529 enddef 1529 enddef
1530 1530
1531 def Test_call_varargs_only() 1531 def Test_call_varargs_only()
1532 MyVarargsOnly()->assert_equal('') 1532 g:MyVarargsOnly()->assert_equal('')
1533 MyVarargsOnly('one')->assert_equal('one') 1533 g:MyVarargsOnly('one')->assert_equal('one')
1534 MyVarargsOnly('one', 'two')->assert_equal('one,two') 1534 g:MyVarargsOnly('one', 'two')->assert_equal('one,two')
1535 CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: Argument 1: type mismatch, expected string but got number') 1535 v9.CheckDefFailure(['g:MyVarargsOnly(1)'], 'E1013: Argument 1: type mismatch, expected string but got number')
1536 CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number') 1536 v9.CheckDefFailure(['g:MyVarargsOnly("one", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number')
1537 enddef 1537 enddef
1538 1538
1539 def Test_using_var_as_arg() 1539 def Test_using_var_as_arg()
1540 var lines =<< trim END 1540 var lines =<< trim END
1541 def Func(x: number) 1541 def Func(x: number)
1542 var x = 234 1542 var x = 234
1543 enddef 1543 enddef
1544 END 1544 END
1545 CheckDefFailure(lines, 'E1006:') 1545 v9.CheckDefFailure(lines, 'E1006:')
1546 1546
1547 lines =<< trim END 1547 lines =<< trim END
1548 def Func(Ref: number) 1548 def Func(Ref: number)
1549 def Ref() 1549 def Ref()
1550 enddef 1550 enddef
1551 enddef 1551 enddef
1552 END 1552 END
1553 CheckDefFailure(lines, 'E1073:') 1553 v9.CheckDefFailure(lines, 'E1073:')
1554 enddef 1554 enddef
1555 1555
1556 def DictArg(arg: dict<string>) 1556 def s:DictArg(arg: dict<string>)
1557 arg['key'] = 'value' 1557 arg['key'] = 'value'
1558 enddef 1558 enddef
1559 1559
1560 def ListArg(arg: list<string>) 1560 def s:ListArg(arg: list<string>)
1561 arg[0] = 'value' 1561 arg[0] = 'value'
1562 enddef 1562 enddef
1563 1563
1564 def Test_assign_to_argument() 1564 def Test_assign_to_argument()
1565 # works for dict and list 1565 # works for dict and list
1568 d['key']->assert_equal('value') 1568 d['key']->assert_equal('value')
1569 var l: list<string> = [] 1569 var l: list<string> = []
1570 ListArg(l) 1570 ListArg(l)
1571 l[0]->assert_equal('value') 1571 l[0]->assert_equal('value')
1572 1572
1573 CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:') 1573 v9.CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:')
1574 delfunc! g:Func 1574 delfunc! g:Func
1575 enddef 1575 enddef
1576 1576
1577 " These argument names are reserved in legacy functions. 1577 " These argument names are reserved in legacy functions.
1578 def WithReservedNames(firstline: string, lastline: string): string 1578 def s:WithReservedNames(firstline: string, lastline: string): string
1579 return firstline .. lastline 1579 return firstline .. lastline
1580 enddef 1580 enddef
1581 1581
1582 def Test_argument_names() 1582 def Test_argument_names()
1583 assert_equal('OK', WithReservedNames('O', 'K')) 1583 assert_equal('OK', WithReservedNames('O', 'K'))
1603 return 123 1603 return 123
1604 enddef 1604 enddef
1605 var Funcref: func: number = function('RetNumber') 1605 var Funcref: func: number = function('RetNumber')
1606 Funcref()->assert_equal(123) 1606 Funcref()->assert_equal(123)
1607 END 1607 END
1608 CheckScriptSuccess(lines) 1608 v9.CheckScriptSuccess(lines)
1609 1609
1610 lines =<< trim END 1610 lines =<< trim END
1611 vim9script 1611 vim9script
1612 def RetNumber(): number 1612 def RetNumber(): number
1613 return 123 1613 return 123
1616 return F() 1616 return F()
1617 enddef 1617 enddef
1618 var Funcref = function('RetNumber') 1618 var Funcref = function('RetNumber')
1619 Bar(Funcref)->assert_equal(123) 1619 Bar(Funcref)->assert_equal(123)
1620 END 1620 END
1621 CheckScriptSuccess(lines) 1621 v9.CheckScriptSuccess(lines)
1622 1622
1623 lines =<< trim END 1623 lines =<< trim END
1624 vim9script 1624 vim9script
1625 def UseNumber(nr: number) 1625 def UseNumber(nr: number)
1626 echo nr 1626 echo nr
1627 enddef 1627 enddef
1628 var Funcref: func(number) = function('UseNumber') 1628 var Funcref: func(number) = function('UseNumber')
1629 Funcref(123) 1629 Funcref(123)
1630 END 1630 END
1631 CheckScriptSuccess(lines) 1631 v9.CheckScriptSuccess(lines)
1632 1632
1633 lines =<< trim END 1633 lines =<< trim END
1634 vim9script 1634 vim9script
1635 def UseNumber(nr: number) 1635 def UseNumber(nr: number)
1636 echo nr 1636 echo nr
1637 enddef 1637 enddef
1638 var Funcref: func(string) = function('UseNumber') 1638 var Funcref: func(string) = function('UseNumber')
1639 END 1639 END
1640 CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(string) but got func(number)') 1640 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(string) but got func(number)')
1641 1641
1642 lines =<< trim END 1642 lines =<< trim END
1643 vim9script 1643 vim9script
1644 def EchoNr(nr = 34) 1644 def EchoNr(nr = 34)
1645 g:echo = nr 1645 g:echo = nr
1648 Funcref() 1648 Funcref()
1649 g:echo->assert_equal(34) 1649 g:echo->assert_equal(34)
1650 Funcref(123) 1650 Funcref(123)
1651 g:echo->assert_equal(123) 1651 g:echo->assert_equal(123)
1652 END 1652 END
1653 CheckScriptSuccess(lines) 1653 v9.CheckScriptSuccess(lines)
1654 1654
1655 lines =<< trim END 1655 lines =<< trim END
1656 vim9script 1656 vim9script
1657 def EchoList(...l: list<number>) 1657 def EchoList(...l: list<number>)
1658 g:echo = l 1658 g:echo = l
1661 Funcref() 1661 Funcref()
1662 g:echo->assert_equal([]) 1662 g:echo->assert_equal([])
1663 Funcref(1, 2, 3) 1663 Funcref(1, 2, 3)
1664 g:echo->assert_equal([1, 2, 3]) 1664 g:echo->assert_equal([1, 2, 3])
1665 END 1665 END
1666 CheckScriptSuccess(lines) 1666 v9.CheckScriptSuccess(lines)
1667 1667
1668 lines =<< trim END 1668 lines =<< trim END
1669 vim9script 1669 vim9script
1670 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number 1670 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number
1671 g:optarg = opt 1671 g:optarg = opt
1683 1683
1684 Funcref(17, 18, 1, 2, 3)->assert_equal(17) 1684 Funcref(17, 18, 1, 2, 3)->assert_equal(17)
1685 g:optarg->assert_equal(18) 1685 g:optarg->assert_equal(18)
1686 g:listarg->assert_equal([1, 2, 3]) 1686 g:listarg->assert_equal([1, 2, 3])
1687 END 1687 END
1688 CheckScriptSuccess(lines) 1688 v9.CheckScriptSuccess(lines)
1689 enddef 1689 enddef
1690 1690
1691 let SomeFunc = function('len') 1691 let SomeFunc = function('len')
1692 let NotAFunc = 'text' 1692 let NotAFunc = 'text'
1693 1693
1739 enddef 1739 enddef
1740 1740
1741 # Compile all functions 1741 # Compile all functions
1742 defcompile 1742 defcompile
1743 END 1743 END
1744 CheckScriptFailure(lines, 'E1173: Text found after enddef: BBBB') 1744 v9.CheckScriptFailure(lines, 'E1173: Text found after enddef: BBBB')
1745 enddef 1745 enddef
1746 1746
1747 def Test_nested_function_with_args_split() 1747 def Test_nested_function_with_args_split()
1748 var lines =<< trim END 1748 var lines =<< trim END
1749 vim9script 1749 vim9script
1756 enddef|BBBB 1756 enddef|BBBB
1757 enddef 1757 enddef
1758 # Compile all functions 1758 # Compile all functions
1759 defcompile 1759 defcompile
1760 END 1760 END
1761 CheckScriptFailure(lines, 'E1173: Text found after enddef: BBBB') 1761 v9.CheckScriptFailure(lines, 'E1173: Text found after enddef: BBBB')
1762 1762
1763 lines =<< trim END 1763 lines =<< trim END
1764 vim9script 1764 vim9script
1765 def FirstFunction() 1765 def FirstFunction()
1766 func SecondFunction() 1766 func SecondFunction()
1767 endfunc|BBBB 1767 endfunc|BBBB
1768 enddef 1768 enddef
1769 defcompile 1769 defcompile
1770 END 1770 END
1771 CheckScriptFailure(lines, 'E1173: Text found after endfunction: BBBB') 1771 v9.CheckScriptFailure(lines, 'E1173: Text found after endfunction: BBBB')
1772 enddef 1772 enddef
1773 1773
1774 def Test_error_in_function_args() 1774 def Test_error_in_function_args()
1775 var lines =<< trim END 1775 var lines =<< trim END
1776 def FirstFunction() 1776 def FirstFunction()
1781 enddef|BBBB 1781 enddef|BBBB
1782 enddef 1782 enddef
1783 # Compile all functions 1783 # Compile all functions
1784 defcompile 1784 defcompile
1785 END 1785 END
1786 CheckScriptFailure(lines, 'E488:') 1786 v9.CheckScriptFailure(lines, 'E488:')
1787 enddef 1787 enddef
1788 1788
1789 def Test_return_type_wrong() 1789 def Test_return_type_wrong()
1790 CheckScriptFailure([ 1790 v9.CheckScriptFailure([
1791 'def Func(): number', 1791 'def Func(): number',
1792 'return "a"', 1792 'return "a"',
1793 'enddef', 1793 'enddef',
1794 'defcompile'], 'expected number but got string') 1794 'defcompile'], 'expected number but got string')
1795 delfunc! g:Func 1795 delfunc! g:Func
1796 CheckScriptFailure([ 1796 v9.CheckScriptFailure([
1797 'def Func(): string', 1797 'def Func(): string',
1798 'return 1', 1798 'return 1',
1799 'enddef', 1799 'enddef',
1800 'defcompile'], 'expected string but got number') 1800 'defcompile'], 'expected string but got number')
1801 delfunc! g:Func 1801 delfunc! g:Func
1802 CheckScriptFailure([ 1802 v9.CheckScriptFailure([
1803 'def Func(): void', 1803 'def Func(): void',
1804 'return "a"', 1804 'return "a"',
1805 'enddef', 1805 'enddef',
1806 'defcompile'], 1806 'defcompile'],
1807 'E1096: Returning a value in a function without a return type') 1807 'E1096: Returning a value in a function without a return type')
1808 delfunc! g:Func 1808 delfunc! g:Func
1809 CheckScriptFailure([ 1809 v9.CheckScriptFailure([
1810 'def Func()', 1810 'def Func()',
1811 'return "a"', 1811 'return "a"',
1812 'enddef', 1812 'enddef',
1813 'defcompile'], 1813 'defcompile'],
1814 'E1096: Returning a value in a function without a return type') 1814 'E1096: Returning a value in a function without a return type')
1815 delfunc! g:Func 1815 delfunc! g:Func
1816 1816
1817 CheckScriptFailure([ 1817 v9.CheckScriptFailure([
1818 'def Func(): number', 1818 'def Func(): number',
1819 'return', 1819 'return',
1820 'enddef', 1820 'enddef',
1821 'defcompile'], 'E1003:') 1821 'defcompile'], 'E1003:')
1822 delfunc! g:Func 1822 delfunc! g:Func
1823 1823
1824 CheckScriptFailure([ 1824 v9.CheckScriptFailure([
1825 'def Func():number', 1825 'def Func():number',
1826 'return 123', 1826 'return 123',
1827 'enddef', 1827 'enddef',
1828 'defcompile'], 'E1069:') 1828 'defcompile'], 'E1069:')
1829 delfunc! g:Func 1829 delfunc! g:Func
1830 1830
1831 CheckScriptFailure([ 1831 v9.CheckScriptFailure([
1832 'def Func() :number', 1832 'def Func() :number',
1833 'return 123', 1833 'return 123',
1834 'enddef', 1834 'enddef',
1835 'defcompile'], 'E1059:') 1835 'defcompile'], 'E1059:')
1836 delfunc! g:Func 1836 delfunc! g:Func
1837 1837
1838 CheckScriptFailure([ 1838 v9.CheckScriptFailure([
1839 'def Func() : number', 1839 'def Func() : number',
1840 'return 123', 1840 'return 123',
1841 'enddef', 1841 'enddef',
1842 'defcompile'], 'E1059:') 1842 'defcompile'], 'E1059:')
1843 delfunc! g:Func 1843 delfunc! g:Func
1844 1844
1845 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 1845 v9.CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
1846 delfunc! g:Func 1846 delfunc! g:Func
1847 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 1847 v9.CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
1848 delfunc! g:Func 1848 delfunc! g:Func
1849 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:') 1849 v9.CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
1850 delfunc! g:Func 1850 delfunc! g:Func
1851 1851
1852 CheckScriptFailure([ 1852 v9.CheckScriptFailure([
1853 'vim9script', 1853 'vim9script',
1854 'def FuncB()', 1854 'def FuncB()',
1855 ' return 123', 1855 ' return 123',
1856 'enddef', 1856 'enddef',
1857 'def FuncA()', 1857 'def FuncA()',
1859 'enddef', 1859 'enddef',
1860 'defcompile'], 'E1096:') 1860 'defcompile'], 'E1096:')
1861 enddef 1861 enddef
1862 1862
1863 def Test_arg_type_wrong() 1863 def Test_arg_type_wrong()
1864 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 1864 v9.CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
1865 CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...') 1865 v9.CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
1866 CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:') 1866 v9.CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:')
1867 CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:') 1867 v9.CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:')
1868 CheckScriptFailure(['def Func6(...x:list<number>)', 'echo "a"', 'enddef'], 'E1069:') 1868 v9.CheckScriptFailure(['def Func6(...x:list<number>)', 'echo "a"', 'enddef'], 'E1069:')
1869 CheckScriptFailure(['def Func7(...x: int)', 'echo "a"', 'enddef'], 'E1010:') 1869 v9.CheckScriptFailure(['def Func7(...x: int)', 'echo "a"', 'enddef'], 'E1010:')
1870 enddef 1870 enddef
1871 1871
1872 def Test_white_space_before_comma() 1872 def Test_white_space_before_comma()
1873 var lines =<< trim END 1873 var lines =<< trim END
1874 vim9script 1874 vim9script
1875 def Func(a: number , b: number) 1875 def Func(a: number , b: number)
1876 enddef 1876 enddef
1877 END 1877 END
1878 CheckScriptFailure(lines, 'E1068:') 1878 v9.CheckScriptFailure(lines, 'E1068:')
1879 call assert_fails('vim9cmd echo stridx("a" .. "b" , "a")', 'E1068:') 1879 call assert_fails('vim9cmd echo stridx("a" .. "b" , "a")', 'E1068:')
1880 enddef 1880 enddef
1881 1881
1882 def Test_white_space_after_comma() 1882 def Test_white_space_after_comma()
1883 var lines =<< trim END 1883 var lines =<< trim END
1884 vim9script 1884 vim9script
1885 def Func(a: number,b: number) 1885 def Func(a: number,b: number)
1886 enddef 1886 enddef
1887 END 1887 END
1888 CheckScriptFailure(lines, 'E1069:') 1888 v9.CheckScriptFailure(lines, 'E1069:')
1889 1889
1890 # OK in legacy function 1890 # OK in legacy function
1891 lines =<< trim END 1891 lines =<< trim END
1892 vim9script 1892 vim9script
1893 func Func(a,b) 1893 func Func(a,b)
1894 endfunc 1894 endfunc
1895 END 1895 END
1896 CheckScriptSuccess(lines) 1896 v9.CheckScriptSuccess(lines)
1897 enddef 1897 enddef
1898 1898
1899 def Test_vim9script_call() 1899 def Test_vim9script_call()
1900 var lines =<< trim END 1900 var lines =<< trim END
1901 vim9script 1901 vim9script
1996 def MyFunc(arg: string) 1996 def MyFunc(arg: string)
1997 var name = 123 1997 var name = 123
1998 enddef 1998 enddef
1999 defcompile 1999 defcompile
2000 END 2000 END
2001 CheckScriptFailure(lines, 'E1054:') 2001 v9.CheckScriptFailure(lines, 'E1054:')
2002 enddef 2002 enddef
2003 2003
2004 def Test_vim9script_call_fail_type() 2004 def Test_vim9script_call_fail_type()
2005 var lines =<< trim END 2005 var lines =<< trim END
2006 vim9script 2006 vim9script
2007 def MyFunc(arg: string) 2007 def MyFunc(arg: string)
2008 echo arg 2008 echo arg
2009 enddef 2009 enddef
2010 MyFunc(1234) 2010 MyFunc(1234)
2011 END 2011 END
2012 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number') 2012 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number')
2013 enddef 2013 enddef
2014 2014
2015 def Test_vim9script_call_fail_const() 2015 def Test_vim9script_call_fail_const()
2016 var lines =<< trim END 2016 var lines =<< trim END
2017 vim9script 2017 vim9script
2032 g:Aconst = 99 2032 g:Aconst = 99
2033 enddef 2033 enddef
2034 call Change() 2034 call Change()
2035 unlet g:Aconst 2035 unlet g:Aconst
2036 END 2036 END
2037 CheckScriptFailure(lines, 'E741: Value is locked: Aconst', 2) 2037 v9.CheckScriptFailure(lines, 'E741: Value is locked: Aconst', 2)
2038 enddef 2038 enddef
2039 2039
2040 " Test that inside :function a Python function can be defined, :def is not 2040 " Test that inside :function a Python function can be defined, :def is not
2041 " recognized. 2041 " recognized.
2042 func Test_function_python() 2042 func Test_function_python()
2054 def g:GoneSoon() 2054 def g:GoneSoon()
2055 echo 'hello' 2055 echo 'hello'
2056 enddef 2056 enddef
2057 2057
2058 def CallGoneSoon() 2058 def CallGoneSoon()
2059 GoneSoon() 2059 g:GoneSoon()
2060 enddef 2060 enddef
2061 defcompile 2061 defcompile
2062 2062
2063 delfunc g:GoneSoon 2063 delfunc g:GoneSoon
2064 CallGoneSoon() 2064 CallGoneSoon()
2097 nnoremap <F4> <Cmd>call <SID>TermRun()<CR> 2097 nnoremap <F4> <Cmd>call <SID>TermRun()<CR>
2098 timer_start(100, (_) => feedkeys("\<F4>")) 2098 timer_start(100, (_) => feedkeys("\<F4>"))
2099 timer_start(1000, (_) => feedkeys("\<F4>")) 2099 timer_start(1000, (_) => feedkeys("\<F4>"))
2100 sleep 1500m 2100 sleep 1500m
2101 END 2101 END
2102 CheckScriptSuccess(lines) 2102 v9.CheckScriptSuccess(lines)
2103 nunmap <F4> 2103 nunmap <F4>
2104 set updatetime& 2104 set updatetime&
2105 enddef 2105 enddef
2106 2106
2107 def Test_redef_failure() 2107 def Test_redef_failure()
2165 2165
2166 def FuncTwoArgNoRet(one: bool, two: number) 2166 def FuncTwoArgNoRet(one: bool, two: number)
2167 s:funcResult = two 2167 s:funcResult = two
2168 enddef 2168 enddef
2169 2169
2170 def FuncOneArgRetString(arg: string): string 2170 def s:FuncOneArgRetString(arg: string): string
2171 return arg 2171 return arg
2172 enddef 2172 enddef
2173 2173
2174 def FuncOneArgRetAny(arg: any): any 2174 def s:FuncOneArgRetAny(arg: any): any
2175 return arg 2175 return arg
2176 enddef 2176 enddef
2177 2177
2178 def Test_func_type() 2178 def Test_func_type()
2179 var Ref1: func() 2179 var Ref1: func()
2180 s:funcResult = 0 2180 s:funcResult = 0
2181 Ref1 = FuncNoArgNoRet 2181 Ref1 = g:FuncNoArgNoRet
2182 Ref1() 2182 Ref1()
2183 s:funcResult->assert_equal(11) 2183 s:funcResult->assert_equal(11)
2184 2184
2185 var Ref2: func 2185 var Ref2: func
2186 s:funcResult = 0 2186 s:funcResult = 0
2187 Ref2 = FuncNoArgNoRet 2187 Ref2 = g:FuncNoArgNoRet
2188 Ref2() 2188 Ref2()
2189 s:funcResult->assert_equal(11) 2189 s:funcResult->assert_equal(11)
2190 2190
2191 s:funcResult = 0 2191 s:funcResult = 0
2192 Ref2 = FuncOneArgNoRet 2192 Ref2 = g:FuncOneArgNoRet
2193 Ref2(12) 2193 Ref2(12)
2194 s:funcResult->assert_equal(12) 2194 s:funcResult->assert_equal(12)
2195 2195
2196 s:funcResult = 0 2196 s:funcResult = 0
2197 Ref2 = FuncNoArgRetNumber 2197 Ref2 = g:FuncNoArgRetNumber
2198 Ref2()->assert_equal(1234) 2198 Ref2()->assert_equal(1234)
2199 s:funcResult->assert_equal(22) 2199 s:funcResult->assert_equal(22)
2200 2200
2201 s:funcResult = 0 2201 s:funcResult = 0
2202 Ref2 = FuncOneArgRetNumber 2202 Ref2 = FuncOneArgRetNumber
2227 res->assert_equal('fileonefiletwo') 2227 res->assert_equal('fileonefiletwo')
2228 enddef 2228 enddef
2229 2229
2230 def Test_func_type_part() 2230 def Test_func_type_part()
2231 var RefVoid: func: void 2231 var RefVoid: func: void
2232 RefVoid = FuncNoArgNoRet 2232 RefVoid = g:FuncNoArgNoRet
2233 RefVoid = FuncOneArgNoRet 2233 RefVoid = g:FuncOneArgNoRet
2234 CheckDefFailure(['var RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...) but got func(): number') 2234 v9.CheckDefFailure(['var RefVoid: func: void', 'RefVoid = g:FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...) but got func(): number')
2235 CheckDefFailure(['var RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...) but got func(): string') 2235 v9.CheckDefFailure(['var RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...) but got func(): string')
2236 2236
2237 var RefAny: func(): any 2237 var RefAny: func(): any
2238 RefAny = FuncNoArgRetNumber 2238 RefAny = g:FuncNoArgRetNumber
2239 RefAny = FuncNoArgRetString 2239 RefAny = FuncNoArgRetString
2240 CheckDefFailure(['var RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func()') 2240 v9.CheckDefFailure(['var RefAny: func(): any', 'RefAny = g:FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func()')
2241 CheckDefFailure(['var RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func(number)') 2241 v9.CheckDefFailure(['var RefAny: func(): any', 'RefAny = g:FuncOneArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func(number)')
2242 2242
2243 var RefAnyNoArgs: func: any = RefAny 2243 var RefAnyNoArgs: func: any = RefAny
2244 2244
2245 var RefNr: func: number 2245 var RefNr: func: number
2246 RefNr = FuncNoArgRetNumber 2246 RefNr = g:FuncNoArgRetNumber
2247 RefNr = FuncOneArgRetNumber 2247 RefNr = FuncOneArgRetNumber
2248 CheckDefFailure(['var RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): number but got func()') 2248 v9.CheckDefFailure(['var RefNr: func: number', 'RefNr = g:FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): number but got func()')
2249 CheckDefFailure(['var RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...): number but got func(): string') 2249 v9.CheckDefFailure(['var RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...): number but got func(): string')
2250 2250
2251 var RefStr: func: string 2251 var RefStr: func: string
2252 RefStr = FuncNoArgRetString 2252 RefStr = FuncNoArgRetString
2253 RefStr = FuncOneArgRetString 2253 RefStr = FuncOneArgRetString
2254 CheckDefFailure(['var RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): string but got func()') 2254 v9.CheckDefFailure(['var RefStr: func: string', 'RefStr = g:FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): string but got func()')
2255 CheckDefFailure(['var RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...): string but got func(): number') 2255 v9.CheckDefFailure(['var RefStr: func: string', 'RefStr = g:FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...): string but got func(): number')
2256 enddef 2256 enddef
2257 2257
2258 def Test_func_type_fails() 2258 def Test_func_type_fails()
2259 CheckDefFailure(['var ref1: func()'], 'E704:') 2259 v9.CheckDefFailure(['var ref1: func()'], 'E704:')
2260 2260
2261 CheckDefFailure(['var Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(): number') 2261 v9.CheckDefFailure(['var Ref1: func()', 'Ref1 = g:FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(): number')
2262 CheckDefFailure(['var Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func() but got func(number)') 2262 v9.CheckDefFailure(['var Ref1: func()', 'Ref1 = g:FuncOneArgNoRet'], 'E1012: Type mismatch; expected func() but got func(number)')
2263 CheckDefFailure(['var Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(number): number') 2263 v9.CheckDefFailure(['var Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(number): number')
2264 CheckDefFailure(['var Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(bool) but got func(bool, number)') 2264 v9.CheckDefFailure(['var Ref1: func(bool)', 'Ref1 = g:FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(bool) but got func(bool, number)')
2265 CheckDefFailure(['var Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(?bool) but got func(bool, number)') 2265 v9.CheckDefFailure(['var Ref1: func(?bool)', 'Ref1 = g:FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(?bool) but got func(bool, number)')
2266 CheckDefFailure(['var Ref1: func(...bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(...bool) but got func(bool, number)') 2266 v9.CheckDefFailure(['var Ref1: func(...bool)', 'Ref1 = g:FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(...bool) but got func(bool, number)')
2267 2267
2268 CheckDefFailure(['var RefWrong: func(string ,number)'], 'E1068:') 2268 v9.CheckDefFailure(['var RefWrong: func(string ,number)'], 'E1068:')
2269 CheckDefFailure(['var RefWrong: func(string,number)'], 'E1069:') 2269 v9.CheckDefFailure(['var RefWrong: func(string,number)'], 'E1069:')
2270 CheckDefFailure(['var RefWrong: func(bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool)'], 'E1005:') 2270 v9.CheckDefFailure(['var RefWrong: func(bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool)'], 'E1005:')
2271 CheckDefFailure(['var RefWrong: func(bool):string'], 'E1069:') 2271 v9.CheckDefFailure(['var RefWrong: func(bool):string'], 'E1069:')
2272 enddef 2272 enddef
2273 2273
2274 def Test_func_return_type() 2274 def Test_func_return_type()
2275 var nr: number 2275 var nr: number
2276 nr = FuncNoArgRetNumber() 2276 nr = g:FuncNoArgRetNumber()
2277 nr->assert_equal(1234) 2277 nr->assert_equal(1234)
2278 2278
2279 nr = FuncOneArgRetAny(122) 2279 nr = FuncOneArgRetAny(122)
2280 nr->assert_equal(122) 2280 nr->assert_equal(122)
2281 2281
2282 var str: string 2282 var str: string
2283 str = FuncOneArgRetAny('yes') 2283 str = FuncOneArgRetAny('yes')
2284 str->assert_equal('yes') 2284 str->assert_equal('yes')
2285 2285
2286 CheckDefFailure(['var str: string', 'str = FuncNoArgRetNumber()'], 'E1012: Type mismatch; expected string but got number') 2286 v9.CheckDefFailure(['var str: string', 'str = g:FuncNoArgRetNumber()'], 'E1012: Type mismatch; expected string but got number')
2287 enddef 2287 enddef
2288 2288
2289 def Test_func_common_type() 2289 def Test_func_common_type()
2290 def FuncOne(n: number): number 2290 def FuncOne(n: number): number
2291 return n 2291 return n
2300 assert_equal(8, list[0](8)) 2300 assert_equal(8, list[0](8))
2301 assert_equal(4, list[1]('word')) 2301 assert_equal(4, list[1]('word'))
2302 assert_equal(7, list[2](3, 'word')) 2302 assert_equal(7, list[2](3, 'word'))
2303 enddef 2303 enddef
2304 2304
2305 def MultiLine( 2305 def s:MultiLine(
2306 arg1: string, 2306 arg1: string,
2307 arg2 = 1234, 2307 arg2 = 1234,
2308 ...rest: list<string> 2308 ...rest: list<string>
2309 ): string 2309 ): string
2310 return arg1 .. arg2 .. join(rest, '-') 2310 return arg1 .. arg2 .. join(rest, '-')
2324 MultiLine('text', 777, 'one')->assert_equal('text777one') 2324 MultiLine('text', 777, 'one')->assert_equal('text777one')
2325 MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two') 2325 MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
2326 enddef 2326 enddef
2327 2327
2328 func Test_multiline_not_vim9() 2328 func Test_multiline_not_vim9()
2329 call MultiLine('text')->assert_equal('text1234') 2329 call s:MultiLine('text')->assert_equal('text1234')
2330 call MultiLine('text', 777)->assert_equal('text777') 2330 call s:MultiLine('text', 777)->assert_equal('text777')
2331 call MultiLine('text', 777, 'one')->assert_equal('text777one') 2331 call s:MultiLine('text', 777, 'one')->assert_equal('text777one')
2332 call MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two') 2332 call s:MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
2333 endfunc 2333 endfunc
2334 2334
2335 2335
2336 " When using CheckScriptFailure() for the below test, E1010 is generated instead 2336 " When using CheckScriptFailure() for the below test, E1010 is generated instead
2337 " of E1056. 2337 " of E1056.
2424 2424
2425 delete('Xdef') 2425 delete('Xdef')
2426 enddef 2426 enddef
2427 2427
2428 def Test_deleted_function() 2428 def Test_deleted_function()
2429 CheckDefExecFailure([ 2429 v9.CheckDefExecFailure([
2430 'var RefMe: func = function("g:DelMe")', 2430 'var RefMe: func = function("g:DelMe")',
2431 'delfunc g:DelMe', 2431 'delfunc g:DelMe',
2432 'echo RefMe()'], 'E117:') 2432 'echo RefMe()'], 'E117:')
2433 enddef 2433 enddef
2434 2434
2435 def Test_unknown_function() 2435 def Test_unknown_function()
2436 CheckDefExecFailure([ 2436 v9.CheckDefExecFailure([
2437 'var Ref: func = function("NotExist")', 2437 'var Ref: func = function("NotExist")',
2438 'delfunc g:NotExist'], 'E700:') 2438 'delfunc g:NotExist'], 'E700:')
2439 enddef 2439 enddef
2440 2440
2441 def RefFunc(Ref: func(any): any): string 2441 def s:RefFunc(Ref: func(any): any): string
2442 return Ref('more') 2442 return Ref('more')
2443 enddef 2443 enddef
2444 2444
2445 def Test_closure_simple() 2445 def Test_closure_simple()
2446 var local = 'some ' 2446 var local = 'some '
2447 RefFunc((s) => local .. s)->assert_equal('some more') 2447 RefFunc((s) => local .. s)->assert_equal('some more')
2448 enddef 2448 enddef
2449 2449
2450 def MakeRef() 2450 def s:MakeRef()
2451 var local = 'some ' 2451 var local = 'some '
2452 g:Ref = (s) => local .. s 2452 g:Ref = (s) => local .. s
2453 enddef 2453 enddef
2454 2454
2455 def Test_closure_ref_after_return() 2455 def Test_closure_ref_after_return()
2456 MakeRef() 2456 MakeRef()
2457 g:Ref('thing')->assert_equal('some thing') 2457 g:Ref('thing')->assert_equal('some thing')
2458 unlet g:Ref 2458 unlet g:Ref
2459 enddef 2459 enddef
2460 2460
2461 def MakeTwoRefs() 2461 def s:MakeTwoRefs()
2462 var local = ['some'] 2462 var local = ['some']
2463 g:Extend = (s) => local->add(s) 2463 g:Extend = (s) => local->add(s)
2464 g:Read = () => local 2464 g:Read = () => local
2465 enddef 2465 enddef
2466 2466
2474 2474
2475 unlet g:Extend 2475 unlet g:Extend
2476 unlet g:Read 2476 unlet g:Read
2477 enddef 2477 enddef
2478 2478
2479 def ReadRef(Ref: func(): list<string>): string 2479 def s:ReadRef(Ref: func(): list<string>): string
2480 return join(Ref(), ' ') 2480 return join(Ref(), ' ')
2481 enddef 2481 enddef
2482 2482
2483 def ExtendRef(Ref: func(string): list<string>, add: string) 2483 def s:ExtendRef(Ref: func(string): list<string>, add: string)
2484 Ref(add) 2484 Ref(add)
2485 enddef 2485 enddef
2486 2486
2487 def Test_closure_two_indirect_refs() 2487 def Test_closure_two_indirect_refs()
2488 MakeTwoRefs() 2488 MakeTwoRefs()
2494 2494
2495 unlet g:Extend 2495 unlet g:Extend
2496 unlet g:Read 2496 unlet g:Read
2497 enddef 2497 enddef
2498 2498
2499 def MakeArgRefs(theArg: string) 2499 def s:MakeArgRefs(theArg: string)
2500 var local = 'loc_val' 2500 var local = 'loc_val'
2501 g:UseArg = (s) => theArg .. '/' .. local .. '/' .. s 2501 g:UseArg = (s) => theArg .. '/' .. local .. '/' .. s
2502 enddef 2502 enddef
2503 2503
2504 def MakeArgRefsVarargs(theArg: string, ...rest: list<string>) 2504 def s:MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
2505 var local = 'the_loc' 2505 var local = 'the_loc'
2506 g:UseVararg = (s) => theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest) 2506 g:UseVararg = (s) => theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)
2507 enddef 2507 enddef
2508 2508
2509 def Test_closure_using_argument() 2509 def Test_closure_using_argument()
2524 def Inc(nr: number): number 2524 def Inc(nr: number): number
2525 return nr + 2 2525 return nr + 2
2526 enddef 2526 enddef
2527 assert_equal([3, 4, 5], Test(Inc)) 2527 assert_equal([3, 4, 5], Test(Inc))
2528 END 2528 END
2529 CheckScriptSuccess(lines) 2529 v9.CheckScriptSuccess(lines)
2530 enddef 2530 enddef
2531 2531
2532 def MakeGetAndAppendRefs() 2532 def s:MakeGetAndAppendRefs()
2533 var local = 'a' 2533 var local = 'a'
2534 2534
2535 def Append(arg: string) 2535 def Append(arg: string)
2536 local ..= arg 2536 local ..= arg
2537 enddef 2537 enddef
2561 return local .. arg 2561 return local .. arg
2562 enddef 2562 enddef
2563 Closure('!!!')->assert_equal('text!!!') 2563 Closure('!!!')->assert_equal('text!!!')
2564 enddef 2564 enddef
2565 2565
2566 func GetResult(Ref) 2566 func s:GetResult(Ref)
2567 return a:Ref('some') 2567 return a:Ref('some')
2568 endfunc 2568 endfunc
2569 2569
2570 def Test_call_closure_not_compiled() 2570 def Test_call_closure_not_compiled()
2571 var text = 'text' 2571 var text = 'text'
2582 timer_start(0, () => name) 2582 timer_start(0, () => name)
2583 endfor 2583 endfor
2584 enddef 2584 enddef
2585 Func() 2585 Func()
2586 END 2586 END
2587 CheckScriptSuccess(lines) 2587 v9.CheckScriptSuccess(lines)
2588 enddef 2588 enddef
2589 2589
2590 def Test_nested_closure_used() 2590 def Test_nested_closure_used()
2591 var lines =<< trim END 2591 var lines =<< trim END
2592 vim9script 2592 vim9script
2596 g:Myclosure = () => Closure() 2596 g:Myclosure = () => Closure()
2597 enddef 2597 enddef
2598 Func() 2598 Func()
2599 assert_equal('hello', g:Myclosure()) 2599 assert_equal('hello', g:Myclosure())
2600 END 2600 END
2601 CheckScriptSuccess(lines) 2601 v9.CheckScriptSuccess(lines)
2602 enddef 2602 enddef
2603 2603
2604 def Test_nested_closure_fails() 2604 def Test_nested_closure_fails()
2605 var lines =<< trim END 2605 var lines =<< trim END
2606 vim9script 2606 vim9script
2610 def FuncB(n: number): list<string> 2610 def FuncB(n: number): list<string>
2611 return map([0], (_, v) => n) 2611 return map([0], (_, v) => n)
2612 enddef 2612 enddef
2613 FuncA() 2613 FuncA()
2614 END 2614 END
2615 CheckScriptFailure(lines, 'E1012:') 2615 v9.CheckScriptFailure(lines, 'E1012:')
2616 enddef 2616 enddef
2617 2617
2618 def Test_global_closure() 2618 def Test_global_closure()
2619 var lines =<< trim END 2619 var lines =<< trim END
2620 vim9script 2620 vim9script
2630 2630
2631 new 2631 new
2632 repeat(['aaa', 'bbb', 'ccc'], 3)->setline(1) 2632 repeat(['aaa', 'bbb', 'ccc'], 3)->setline(1)
2633 ReverseEveryNLines(3, 1, 9) 2633 ReverseEveryNLines(3, 1, 9)
2634 END 2634 END
2635 CheckScriptSuccess(lines) 2635 v9.CheckScriptSuccess(lines)
2636 var expected = repeat(['ccc', 'bbb', 'aaa'], 3) 2636 var expected = repeat(['ccc', 'bbb', 'aaa'], 3)
2637 assert_equal(expected, getline(1, 9)) 2637 assert_equal(expected, getline(1, 9))
2638 bwipe! 2638 bwipe!
2639 enddef 2639 enddef
2640 2640
2651 g:Inner() 2651 g:Inner()
2652 assert_equal(2, x) 2652 assert_equal(2, x)
2653 enddef 2653 enddef
2654 Outer() 2654 Outer()
2655 END 2655 END
2656 CheckScriptSuccess(lines) 2656 v9.CheckScriptSuccess(lines)
2657 delfunc g:Inner 2657 delfunc g:Inner
2658 enddef 2658 enddef
2659 2659
2660 def Test_closure_called_from_legacy() 2660 def Test_closure_called_from_legacy()
2661 var lines =<< trim END 2661 var lines =<< trim END
2667 } 2667 }
2668 execute printf('call %s()', string(F)) 2668 execute printf('call %s()', string(F))
2669 enddef 2669 enddef
2670 Func() 2670 Func()
2671 END 2671 END
2672 CheckScriptFailure(lines, 'E1248') 2672 v9.CheckScriptFailure(lines, 'E1248')
2673 enddef 2673 enddef
2674 2674
2675 def Test_failure_in_called_function() 2675 def Test_failure_in_called_function()
2676 # this was using the frame index as the return value 2676 # this was using the frame index as the return value
2677 var lines =<< trim END 2677 var lines =<< trim END
2690 call PopupTerm(0) 2690 call PopupTerm(0)
2691 catch 2691 catch
2692 endtry 2692 endtry
2693 au! TerminalWinOpen 2693 au! TerminalWinOpen
2694 END 2694 END
2695 CheckScriptSuccess(lines) 2695 v9.CheckScriptSuccess(lines)
2696 enddef 2696 enddef
2697 2697
2698 def Test_nested_lambda() 2698 def Test_nested_lambda()
2699 var lines =<< trim END 2699 var lines =<< trim END
2700 vim9script 2700 vim9script
2705 var res = Lambda2() 2705 var res = Lambda2()
2706 assert_equal([7, 4], res) 2706 assert_equal([7, 4], res)
2707 enddef 2707 enddef
2708 Func() 2708 Func()
2709 END 2709 END
2710 CheckScriptSuccess(lines) 2710 v9.CheckScriptSuccess(lines)
2711 enddef 2711 enddef
2712 2712
2713 def Test_double_nested_lambda() 2713 def Test_double_nested_lambda()
2714 var lines =<< trim END 2714 var lines =<< trim END
2715 vim9script 2715 vim9script
2718 return head .. sep .. tail 2718 return head .. sep .. tail
2719 }) 2719 })
2720 enddef 2720 enddef
2721 assert_equal('hello-there', F('hello')('-')('there')) 2721 assert_equal('hello-there', F('hello')('-')('there'))
2722 END 2722 END
2723 CheckScriptSuccess(lines) 2723 v9.CheckScriptSuccess(lines)
2724 enddef 2724 enddef
2725 2725
2726 def Test_nested_inline_lambda() 2726 def Test_nested_inline_lambda()
2727 var lines =<< trim END 2727 var lines =<< trim END
2728 vim9script 2728 vim9script
2731 return sep .. arg .. text 2731 return sep .. arg .. text
2732 }) 2732 })
2733 enddef 2733 enddef
2734 assert_equal('--there++', F('++')('there')('--')) 2734 assert_equal('--there++', F('++')('there')('--'))
2735 END 2735 END
2736 CheckScriptSuccess(lines) 2736 v9.CheckScriptSuccess(lines)
2737 2737
2738 lines =<< trim END 2738 lines =<< trim END
2739 vim9script 2739 vim9script
2740 echo range(4)->mapnew((_, v) => { 2740 echo range(4)->mapnew((_, v) => {
2741 return range(v) ->mapnew((_, s) => { 2741 return range(v) ->mapnew((_, s) => {
2742 return string(s) 2742 return string(s)
2743 }) 2743 })
2744 }) 2744 })
2745 END 2745 END
2746 CheckScriptSuccess(lines) 2746 v9.CheckScriptSuccess(lines)
2747 2747
2748 lines =<< trim END 2748 lines =<< trim END
2749 vim9script 2749 vim9script
2750 2750
2751 def s:func() 2751 def s:func()
2757 })) 2757 }))
2758 enddef 2758 enddef
2759 2759
2760 defcomp 2760 defcomp
2761 END 2761 END
2762 CheckScriptSuccess(lines) 2762 v9.CheckScriptSuccess(lines)
2763 enddef 2763 enddef
2764 2764
2765 def Shadowed(): list<number> 2765 def Shadowed(): list<number>
2766 var FuncList: list<func: number> = [() => 42] 2766 var FuncList: list<func: number> = [() => 42]
2767 return FuncList->mapnew((_, Shadowed) => Shadowed()) 2767 return FuncList->mapnew((_, Shadowed) => Shadowed())
2768 enddef 2768 enddef
2769 2769
2770 def Test_lambda_arg_shadows_func() 2770 def Test_lambda_arg_shadows_func()
2771 assert_equal([42], Shadowed()) 2771 assert_equal([42], g:Shadowed())
2772 enddef 2772 enddef
2773 2773
2774 def Line_continuation_in_def(dir: string = ''): string 2774 def s:Line_continuation_in_def(dir: string = ''): string
2775 var path: string = empty(dir) 2775 var path: string = empty(dir)
2776 \ ? 'empty' 2776 \ ? 'empty'
2777 \ : 'full' 2777 \ : 'full'
2778 return path 2778 return path
2779 enddef 2779 enddef
2786 var lines =<< trim END 2786 var lines =<< trim END
2787 vim9script 2787 vim9script
2788 var script = 'test' 2788 var script = 'test'
2789 assert_equal(['test'], map(['one'], (_, _) => script)) 2789 assert_equal(['test'], map(['one'], (_, _) => script))
2790 END 2790 END
2791 CheckScriptSuccess(lines) 2791 v9.CheckScriptSuccess(lines)
2792 enddef 2792 enddef
2793 2793
2794 def Line_continuation_in_lambda(): list<string> 2794 def s:Line_continuation_in_lambda(): list<string>
2795 var x = range(97, 100) 2795 var x = range(97, 100)
2796 ->mapnew((_, v) => nr2char(v) 2796 ->mapnew((_, v) => nr2char(v)
2797 ->toupper()) 2797 ->toupper())
2798 ->reverse() 2798 ->reverse()
2799 return x 2799 return x
2810 v.m, 2810 v.m,
2811 substitute(v.s, '.*', 'yyy', '') 2811 substitute(v.s, '.*', 'yyy', '')
2812 )) 2812 ))
2813 assert_equal(['1:2:yyy'], res) 2813 assert_equal(['1:2:yyy'], res)
2814 END 2814 END
2815 CheckScriptSuccess(lines) 2815 v9.CheckScriptSuccess(lines)
2816 enddef 2816 enddef
2817 2817
2818 def Test_list_lambda() 2818 def Test_list_lambda()
2819 timer_start(1000, (_) => 0) 2819 timer_start(1000, (_) => 0)
2820 var body = execute(timer_info()[0].callback 2820 var body = execute(timer_info()[0].callback
2832 for i in range(10) 2832 for i in range(10)
2833 var inloop = i 2833 var inloop = i
2834 flist[i] = () => inloop 2834 flist[i] = () => inloop
2835 endfor 2835 endfor
2836 END 2836 END
2837 CheckScriptSuccess(lines) 2837 v9.CheckScriptSuccess(lines)
2838 2838
2839 lines =<< trim END 2839 lines =<< trim END
2840 vim9script 2840 vim9script
2841 if true 2841 if true
2842 var outloop = 5 2842 var outloop = 5
2844 for i in range(10) 2844 for i in range(10)
2845 flist[i] = () => outloop 2845 flist[i] = () => outloop
2846 endfor 2846 endfor
2847 endif 2847 endif
2848 END 2848 END
2849 CheckScriptSuccess(lines) 2849 v9.CheckScriptSuccess(lines)
2850 2850
2851 lines =<< trim END 2851 lines =<< trim END
2852 vim9script 2852 vim9script
2853 if true 2853 if true
2854 var outloop = 5 2854 var outloop = 5
2856 var flist: list<func> 2856 var flist: list<func>
2857 for i in range(10) 2857 for i in range(10)
2858 flist[i] = () => outloop 2858 flist[i] = () => outloop
2859 endfor 2859 endfor
2860 END 2860 END
2861 CheckScriptFailure(lines, 'E1001: Variable not found: outloop', 1) 2861 v9.CheckScriptFailure(lines, 'E1001: Variable not found: outloop', 1)
2862 2862
2863 lines =<< trim END 2863 lines =<< trim END
2864 vim9script 2864 vim9script
2865 for i in range(10) 2865 for i in range(10)
2866 var Ref = () => 0 2866 var Ref = () => 0
2867 endfor 2867 endfor
2868 assert_equal(0, ((i) => 0)(0)) 2868 assert_equal(0, ((i) => 0)(0))
2869 END 2869 END
2870 CheckScriptSuccess(lines) 2870 v9.CheckScriptSuccess(lines)
2871 enddef 2871 enddef
2872 2872
2873 def Test_legacy_lambda() 2873 def Test_legacy_lambda()
2874 legacy echo {x -> 'hello ' .. x}('foo') 2874 legacy echo {x -> 'hello ' .. x}('foo')
2875 2875
2876 var lines =<< trim END 2876 var lines =<< trim END
2877 echo {x -> 'hello ' .. x}('foo') 2877 echo {x -> 'hello ' .. x}('foo')
2878 END 2878 END
2879 CheckDefAndScriptFailure(lines, 'E720:') 2879 v9.CheckDefAndScriptFailure(lines, 'E720:')
2880 2880
2881 lines =<< trim END 2881 lines =<< trim END
2882 vim9script 2882 vim9script
2883 def Func() 2883 def Func()
2884 echo (() => 'no error')() 2884 echo (() => 'no error')()
2885 enddef 2885 enddef
2886 legacy call s:Func() 2886 legacy call s:Func()
2887 END 2887 END
2888 CheckScriptSuccess(lines) 2888 v9.CheckScriptSuccess(lines)
2889 enddef 2889 enddef
2890 2890
2891 def Test_legacy() 2891 def Test_legacy()
2892 var lines =<< trim END 2892 var lines =<< trim END
2893 vim9script 2893 vim9script
2900 Testit() 2900 Testit()
2901 assert_equal(1, g:legacyvar) 2901 assert_equal(1, g:legacyvar)
2902 unlet g:legacyvar 2902 unlet g:legacyvar
2903 delfunc g:LegacyFunction 2903 delfunc g:LegacyFunction
2904 END 2904 END
2905 CheckScriptSuccess(lines) 2905 v9.CheckScriptSuccess(lines)
2906 enddef 2906 enddef
2907 2907
2908 def Test_legacy_errors() 2908 def Test_legacy_errors()
2909 for cmd in ['if', 'elseif', 'else', 'endif', 2909 for cmd in ['if', 'elseif', 'else', 'endif',
2910 'for', 'endfor', 'continue', 'break', 2910 'for', 'endfor', 'continue', 'break',
2911 'while', 'endwhile', 2911 'while', 'endwhile',
2912 'try', 'catch', 'finally', 'endtry'] 2912 'try', 'catch', 'finally', 'endtry']
2913 CheckDefFailure(['legacy ' .. cmd .. ' expr'], 'E1189:') 2913 v9.CheckDefFailure(['legacy ' .. cmd .. ' expr'], 'E1189:')
2914 endfor 2914 endfor
2915 enddef 2915 enddef
2916 2916
2917 def Test_call_legacy_with_dict() 2917 def Test_call_legacy_with_dict()
2918 var lines =<< trim END 2918 var lines =<< trim END
2940 var d = {value: 'bar', func: Legacy} 2940 var d = {value: 'bar', func: Legacy}
2941 d.func() 2941 d.func()
2942 assert_equal('bar', g:result) 2942 assert_equal('bar', g:result)
2943 unlet g:result 2943 unlet g:result
2944 END 2944 END
2945 CheckScriptSuccess(lines) 2945 v9.CheckScriptSuccess(lines)
2946 enddef 2946 enddef
2947 2947
2948 def DoFilterThis(a: string): list<string> 2948 def s:DoFilterThis(a: string): list<string>
2949 # closure nested inside another closure using argument 2949 # closure nested inside another closure using argument
2950 var Filter = (l) => filter(l, (_, v) => stridx(v, a) == 0) 2950 var Filter = (l) => filter(l, (_, v) => stridx(v, a) == 0)
2951 return ['x', 'y', 'a', 'x2', 'c']->Filter() 2951 return ['x', 'y', 'a', 'x2', 'c']->Filter()
2952 enddef 2952 enddef
2953 2953
2976 defcompile 2976 defcompile
2977 END 2977 END
2978 writefile(lines, 'XTest_silent_echo') 2978 writefile(lines, 'XTest_silent_echo')
2979 2979
2980 # Check that the balloon shows up after a mouse move 2980 # Check that the balloon shows up after a mouse move
2981 var buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6}) 2981 var buf = g:RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
2982 term_sendkeys(buf, ":abc") 2982 term_sendkeys(buf, ":abc")
2983 VerifyScreenDump(buf, 'Test_vim9_silent_echo', {}) 2983 g:VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
2984 2984
2985 # clean up 2985 # clean up
2986 StopVimInTerminal(buf) 2986 g:StopVimInTerminal(buf)
2987 delete('XTest_silent_echo') 2987 delete('XTest_silent_echo')
2988 enddef 2988 enddef
2989 2989
2990 def SilentlyError() 2990 def SilentlyError()
2991 execute('silent! invalid') 2991 execute('silent! invalid')
2992 g:did_it = 'yes' 2992 g:did_it = 'yes'
2993 enddef 2993 enddef
2994 2994
2995 func UserError() 2995 func s:UserError()
2996 silent! invalid 2996 silent! invalid
2997 endfunc 2997 endfunc
2998 2998
2999 def SilentlyUserError() 2999 def SilentlyUserError()
3000 UserError() 3000 UserError()
3026 enddef 3026 enddef
3027 3027
3028 popup_create('popup', {filter: Filter}) 3028 popup_create('popup', {filter: Filter})
3029 feedkeys("o\r", 'xnt') 3029 feedkeys("o\r", 'xnt')
3030 END 3030 END
3031 CheckScriptSuccess(lines) 3031 v9.CheckScriptSuccess(lines)
3032 enddef 3032 enddef
3033 3033
3034 def Fibonacci(n: number): number 3034 def s:Fibonacci(n: number): number
3035 if n < 2 3035 if n < 2
3036 return n 3036 return n
3037 else 3037 else
3038 return Fibonacci(n - 1) + Fibonacci(n - 2) 3038 return Fibonacci(n - 1) + Fibonacci(n - 2)
3039 endif 3039 endif
3041 3041
3042 def Test_recursive_call() 3042 def Test_recursive_call()
3043 Fibonacci(20)->assert_equal(6765) 3043 Fibonacci(20)->assert_equal(6765)
3044 enddef 3044 enddef
3045 3045
3046 def TreeWalk(dir: string): list<any> 3046 def s:TreeWalk(dir: string): list<any>
3047 return readdir(dir)->mapnew((_, val) => 3047 return readdir(dir)->mapnew((_, val) =>
3048 fnamemodify(dir .. '/' .. val, ':p')->isdirectory() 3048 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
3049 ? {[val]: TreeWalk(dir .. '/' .. val)} 3049 ? {[val]: TreeWalk(dir .. '/' .. val)}
3050 : val 3050 : val
3051 ) 3051 )
3065 def Test_invalid_function_name() 3065 def Test_invalid_function_name()
3066 var lines =<< trim END 3066 var lines =<< trim END
3067 vim9script 3067 vim9script
3068 def s: list<string> 3068 def s: list<string>
3069 END 3069 END
3070 CheckScriptFailure(lines, 'E129:') 3070 v9.CheckScriptFailure(lines, 'E129:')
3071 3071
3072 lines =<< trim END 3072 lines =<< trim END
3073 vim9script 3073 vim9script
3074 def g: list<string> 3074 def g: list<string>
3075 END 3075 END
3076 CheckScriptFailure(lines, 'E129:') 3076 v9.CheckScriptFailure(lines, 'E129:')
3077 3077
3078 lines =<< trim END 3078 lines =<< trim END
3079 vim9script 3079 vim9script
3080 def <SID>: list<string> 3080 def <SID>: list<string>
3081 END 3081 END
3082 CheckScriptFailure(lines, 'E884:') 3082 v9.CheckScriptFailure(lines, 'E884:')
3083 3083
3084 lines =<< trim END 3084 lines =<< trim END
3085 vim9script 3085 vim9script
3086 def F list<string> 3086 def F list<string>
3087 END 3087 END
3088 CheckScriptFailure(lines, 'E488:') 3088 v9.CheckScriptFailure(lines, 'E488:')
3089 enddef 3089 enddef
3090 3090
3091 def Test_partial_call() 3091 def Test_partial_call()
3092 var lines =<< trim END 3092 var lines =<< trim END
3093 var Xsetlist: func 3093 var Xsetlist: func
3111 assert_equal(4, Len()) 3111 assert_equal(4, Len())
3112 3112
3113 var RepeatFunc = function('repeat', ['o']) 3113 var RepeatFunc = function('repeat', ['o'])
3114 assert_equal('ooooo', RepeatFunc(5)) 3114 assert_equal('ooooo', RepeatFunc(5))
3115 END 3115 END
3116 CheckDefAndScriptSuccess(lines) 3116 v9.CheckDefAndScriptSuccess(lines)
3117 3117
3118 lines =<< trim END 3118 lines =<< trim END
3119 vim9script 3119 vim9script
3120 def Foo(Parser: any) 3120 def Foo(Parser: any)
3121 enddef 3121 enddef
3122 var Expr: func(dict<any>): dict<any> 3122 var Expr: func(dict<any>): dict<any>
3123 const Call = Foo(Expr) 3123 const Call = Foo(Expr)
3124 END 3124 END
3125 CheckScriptFailure(lines, 'E1235:') 3125 v9.CheckScriptFailure(lines, 'E1235:')
3126 enddef 3126 enddef
3127 3127
3128 def Test_cmd_modifier() 3128 def Test_cmd_modifier()
3129 tab echo '0' 3129 tab echo '0'
3130 CheckDefFailure(['5tab echo 3'], 'E16:') 3130 v9.CheckDefFailure(['5tab echo 3'], 'E16:')
3131 enddef 3131 enddef
3132 3132
3133 def Test_restore_modifiers() 3133 def Test_restore_modifiers()
3134 # check that when compiling a :def function command modifiers are not messed 3134 # check that when compiling a :def function command modifiers are not messed
3135 # up. 3135 # up.
3144 noautocmd call s:AutocmdsDisabled() 3144 noautocmd call s:AutocmdsDisabled()
3145 let g:ei_after = &eventignore 3145 let g:ei_after = &eventignore
3146 endfunc 3146 endfunc
3147 Func() 3147 Func()
3148 END 3148 END
3149 CheckScriptSuccess(lines) 3149 v9.CheckScriptSuccess(lines)
3150 g:ei_after->assert_equal('') 3150 g:ei_after->assert_equal('')
3151 enddef 3151 enddef
3152 3152
3153 def StackTop() 3153 def StackTop()
3154 eval 1 + 2 3154 eval 1 + 2
3155 eval 2 + 3 3155 eval 2 + 3
3156 # call not on fourth line 3156 # call not on fourth line
3157 StackBot() 3157 g:StackBot()
3158 enddef 3158 enddef
3159 3159
3160 def StackBot() 3160 def StackBot()
3161 # throw an error 3161 # throw an error
3162 eval [][0] 3162 eval [][0]
3163 enddef 3163 enddef
3164 3164
3165 def Test_callstack_def() 3165 def Test_callstack_def()
3166 try 3166 try
3167 StackTop() 3167 g:StackTop()
3168 catch 3168 catch
3169 v:throwpoint->assert_match('Test_callstack_def\[2\]..StackTop\[4\]..StackBot, line 2') 3169 v:throwpoint->assert_match('Test_callstack_def\[2\]..StackTop\[4\]..StackBot, line 2')
3170 endtry 3170 endtry
3171 enddef 3171 enddef
3172 3172
3183 var z = x 3183 var z = x
3184 assert_equal(['x', 'x', 'x'], z) 3184 assert_equal(['x', 'x', 'x'], z)
3185 enddef 3185 enddef
3186 Func() 3186 Func()
3187 END 3187 END
3188 CheckScriptSuccess(lines) 3188 v9.CheckScriptSuccess(lines)
3189 enddef 3189 enddef
3190 3190
3191 def Test_reset_did_emsg() 3191 def Test_reset_did_emsg()
3192 var lines =<< trim END 3192 var lines =<< trim END
3193 @s = 'blah' 3193 @s = 'blah'
3197 exe '*s' 3197 exe '*s'
3198 popup_close(winid) 3198 popup_close(winid)
3199 enddef 3199 enddef
3200 Func() 3200 Func()
3201 END 3201 END
3202 CheckScriptFailure(lines, 'E492:', 8) 3202 v9.CheckScriptFailure(lines, 'E492:', 8)
3203 delfunc! g:Func 3203 delfunc! g:Func
3204 enddef 3204 enddef
3205 3205
3206 def Test_did_emsg_reset() 3206 def Test_did_emsg_reset()
3207 # executing an autocommand resets did_emsg, this should not result in a 3207 # executing an autocommand resets did_emsg, this should not result in a
3234 # error is silenced, but function aborts on error 3234 # error is silenced, but function aborts on error
3235 silent! Func() 3235 silent! Func()
3236 assert_equal('none', g:result) 3236 assert_equal('none', g:result)
3237 unlet g:result 3237 unlet g:result
3238 END 3238 END
3239 CheckScriptSuccess(lines) 3239 v9.CheckScriptSuccess(lines)
3240 enddef 3240 enddef
3241 3241
3242 def Test_continues_with_silent_error() 3242 def Test_continues_with_silent_error()
3243 var lines =<< trim END 3243 var lines =<< trim END
3244 vim9script 3244 vim9script
3250 # error is silenced, function does not abort 3250 # error is silenced, function does not abort
3251 Func() 3251 Func()
3252 assert_equal('yes', g:result) 3252 assert_equal('yes', g:result)
3253 unlet g:result 3253 unlet g:result
3254 END 3254 END
3255 CheckScriptSuccess(lines) 3255 v9.CheckScriptSuccess(lines)
3256 enddef 3256 enddef
3257 3257
3258 def Test_abort_even_with_silent() 3258 def Test_abort_even_with_silent()
3259 var lines =<< trim END 3259 var lines =<< trim END
3260 vim9script 3260 vim9script
3265 enddef 3265 enddef
3266 silent! Func() 3266 silent! Func()
3267 assert_equal('none', g:result) 3267 assert_equal('none', g:result)
3268 unlet g:result 3268 unlet g:result
3269 END 3269 END
3270 CheckScriptSuccess(lines) 3270 v9.CheckScriptSuccess(lines)
3271 enddef 3271 enddef
3272 3272
3273 def Test_cmdmod_silent_restored() 3273 def Test_cmdmod_silent_restored()
3274 var lines =<< trim END 3274 var lines =<< trim END
3275 vim9script 3275 vim9script
3313 enddef 3313 enddef
3314 3314
3315 Crash() 3315 Crash()
3316 assert_equal('CbEbEaCa', result) 3316 assert_equal('CbEbEaCa', result)
3317 END 3317 END
3318 CheckScriptSuccess(lines) 3318 v9.CheckScriptSuccess(lines)
3319 enddef 3319 enddef
3320 3320
3321 def Test_dict_member_with_silent() 3321 def Test_dict_member_with_silent()
3322 var lines =<< trim END 3322 var lines =<< trim END
3323 vim9script 3323 vim9script
3331 enddef 3331 enddef
3332 silent! Func() 3332 silent! Func()
3333 assert_equal('0', g:result) 3333 assert_equal('0', g:result)
3334 unlet g:result 3334 unlet g:result
3335 END 3335 END
3336 CheckScriptSuccess(lines) 3336 v9.CheckScriptSuccess(lines)
3337 enddef 3337 enddef
3338 3338
3339 def Test_skip_cmds_with_silent() 3339 def Test_skip_cmds_with_silent()
3340 var lines =<< trim END 3340 var lines =<< trim END
3341 vim9script 3341 vim9script
3349 sil! :/not found/put _ 3349 sil! :/not found/put _
3350 enddef 3350 enddef
3351 3351
3352 Func(true) 3352 Func(true)
3353 END 3353 END
3354 CheckScriptSuccess(lines) 3354 v9.CheckScriptSuccess(lines)
3355 enddef 3355 enddef
3356 3356
3357 def Test_opfunc() 3357 def Test_opfunc()
3358 nnoremap <F3> <cmd>set opfunc=Opfunc<cr>g@ 3358 nnoremap <F3> <cmd>set opfunc=Opfunc<cr>g@
3359 def g:Opfunc(_: any): string 3359 def g:Opfunc(_: any): string
3394 feedkeys('g@l', 'n') 3394 feedkeys('g@l', 'n')
3395 feedkeys('llll') 3395 feedkeys('llll')
3396 END 3396 END
3397 call writefile(lines, 'XTest_opfunc_error') 3397 call writefile(lines, 'XTest_opfunc_error')
3398 3398
3399 var buf = RunVimInTerminal('-S XTest_opfunc_error', {rows: 6, wait_for_ruler: 0}) 3399 var buf = g:RunVimInTerminal('-S XTest_opfunc_error', {rows: 6, wait_for_ruler: 0})
3400 WaitForAssert(() => assert_match('Press ENTER', term_getline(buf, 6))) 3400 g:WaitForAssert(() => assert_match('Press ENTER', term_getline(buf, 6)))
3401 WaitForAssert(() => assert_match('E684: list index out of range: 0', term_getline(buf, 5))) 3401 g:WaitForAssert(() => assert_match('E684: list index out of range: 0', term_getline(buf, 5)))
3402 3402
3403 # clean up 3403 # clean up
3404 StopVimInTerminal(buf) 3404 g:StopVimInTerminal(buf)
3405 delete('XTest_opfunc_error') 3405 delete('XTest_opfunc_error')
3406 enddef 3406 enddef
3407 3407
3408 " this was crashing on exit 3408 " this was crashing on exit
3409 def Test_nested_lambda_in_closure() 3409 def Test_nested_lambda_in_closure()
3417 g:Inner() 3417 g:Inner()
3418 enddef 3418 enddef
3419 defcompile 3419 defcompile
3420 # not reached 3420 # not reached
3421 END 3421 END
3422 if !RunVim([], lines, '--clean -c WriteDone -c quit') 3422 if !g:RunVim([], lines, '--clean -c WriteDone -c quit')
3423 return 3423 return
3424 endif 3424 endif
3425 assert_equal(['Done'], readfile('XnestedDone')) 3425 assert_equal(['Done'], readfile('XnestedDone'))
3426 delete('XnestedDone') 3426 delete('XnestedDone')
3427 enddef 3427 enddef
3444 def H(d: dict<func>): string 3444 def H(d: dict<func>): string
3445 return d.f('a') 3445 return d.f('a')
3446 enddef 3446 enddef
3447 END 3447 END
3448 3448
3449 CheckScriptSuccess(lines + ['echo H(G(F1))']) 3449 v9.CheckScriptSuccess(lines + ['echo H(G(F1))'])
3450 CheckScriptFailure(lines + ['echo H(G(F2))'], 'E1013:') 3450 v9.CheckScriptFailure(lines + ['echo H(G(F2))'], 'E1013:')
3451 enddef 3451 enddef
3452 3452
3453 def Test_list_any_type_checked() 3453 def Test_list_any_type_checked()
3454 var lines =<< trim END 3454 var lines =<< trim END
3455 vim9script 3455 vim9script
3460 def Bar(ll: list<dict<any>>) 3460 def Bar(ll: list<dict<any>>)
3461 enddef 3461 enddef
3462 Foo() 3462 Foo()
3463 END 3463 END
3464 lines[2] = 'var l: list<any>' 3464 lines[2] = 'var l: list<any>'
3465 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<dict<any>> but got list<any>', 2) 3465 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<dict<any>> but got list<any>', 2)
3466 3466
3467 lines[2] = 'var l: list<any> = []' 3467 lines[2] = 'var l: list<any> = []'
3468 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<dict<any>> but got list<any>', 2) 3468 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<dict<any>> but got list<any>', 2)
3469 3469
3470 lines[2] = 'var l: list<any> = [11]' 3470 lines[2] = 'var l: list<any> = [11]'
3471 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<dict<any>> but got list<number>', 2) 3471 v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<dict<any>> but got list<number>', 2)
3472 enddef 3472 enddef
3473 3473
3474 def Test_compile_error() 3474 def Test_compile_error()
3475 var lines =<< trim END 3475 var lines =<< trim END
3476 def g:Broken() 3476 def g:Broken()
3477 echo 'a' + {} 3477 echo 'a' + {}
3478 enddef 3478 enddef
3479 call g:Broken() 3479 call g:Broken()
3480 END 3480 END
3481 # First call: compilation error 3481 # First call: compilation error
3482 CheckScriptFailure(lines, 'E1051: Wrong argument type for +') 3482 v9.CheckScriptFailure(lines, 'E1051: Wrong argument type for +')
3483 3483
3484 # Second call won't try compiling again 3484 # Second call won't try compiling again
3485 assert_fails('call g:Broken()', 'E1091: Function is not compiled: Broken') 3485 assert_fails('call g:Broken()', 'E1091: Function is not compiled: Broken')
3486 delfunc g:Broken 3486 delfunc g:Broken
3487 3487
3490 def g:Broken() 3490 def g:Broken()
3491 echo 'a' + [] 3491 echo 'a' + []
3492 enddef 3492 enddef
3493 silent! defcompile 3493 silent! defcompile
3494 END 3494 END
3495 CheckScriptSuccess(lines) 3495 v9.CheckScriptSuccess(lines)
3496 3496
3497 # Calling the function won't try compiling again 3497 # Calling the function won't try compiling again
3498 assert_fails('call g:Broken()', 'E1091: Function is not compiled: Broken') 3498 assert_fails('call g:Broken()', 'E1091: Function is not compiled: Broken')
3499 delfunc g:Broken 3499 delfunc g:Broken
3500 enddef 3500 enddef
3518 endfunc 3518 endfunc
3519 assert_equal('too', Oktoo()) 3519 assert_equal('too', Oktoo())
3520 3520
3521 assert_equal([[1], [2], [3]], range(3)->mapnew((_, v) => [v]->map((_, w) => w + 1))) 3521 assert_equal([[1], [2], [3]], range(3)->mapnew((_, v) => [v]->map((_, w) => w + 1)))
3522 END 3522 END
3523 CheckScriptSuccess(lines) 3523 v9.CheckScriptSuccess(lines)
3524 3524
3525 lines =<< trim END 3525 lines =<< trim END
3526 def Ignore(_: string): string 3526 def Ignore(_: string): string
3527 return _ 3527 return _
3528 enddef 3528 enddef
3529 defcompile 3529 defcompile
3530 END 3530 END
3531 CheckScriptFailure(lines, 'E1181:', 1) 3531 v9.CheckScriptFailure(lines, 'E1181:', 1)
3532 3532
3533 lines =<< trim END 3533 lines =<< trim END
3534 var _ = 1 3534 var _ = 1
3535 END 3535 END
3536 CheckDefAndScriptFailure(lines, 'E1181:', 1) 3536 v9.CheckDefAndScriptFailure(lines, 'E1181:', 1)
3537 3537
3538 lines =<< trim END 3538 lines =<< trim END
3539 var x = _ 3539 var x = _
3540 END 3540 END
3541 CheckDefAndScriptFailure(lines, 'E1181:', 1) 3541 v9.CheckDefAndScriptFailure(lines, 'E1181:', 1)
3542 enddef 3542 enddef
3543 3543
3544 def Test_too_many_arguments() 3544 def Test_too_many_arguments()
3545 var lines =<< trim END 3545 var lines =<< trim END
3546 echo [0, 1, 2]->map(() => 123) 3546 echo [0, 1, 2]->map(() => 123)
3547 END 3547 END
3548 CheckDefExecAndScriptFailure(lines, 'E1106: 2 arguments too many', 1) 3548 v9.CheckDefExecAndScriptFailure(lines, 'E1106: 2 arguments too many', 1)
3549 3549
3550 lines =<< trim END 3550 lines =<< trim END
3551 echo [0, 1, 2]->map((_) => 123) 3551 echo [0, 1, 2]->map((_) => 123)
3552 END 3552 END
3553 CheckDefExecAndScriptFailure(lines, 'E1106: One argument too many', 1) 3553 v9.CheckDefExecAndScriptFailure(lines, 'E1106: One argument too many', 1)
3554 enddef 3554 enddef
3555 3555
3556 def Test_closing_brace_at_start_of_line() 3556 def Test_closing_brace_at_start_of_line()
3557 var lines =<< trim END 3557 var lines =<< trim END
3558 def Func() 3558 def Func()
3559 enddef 3559 enddef
3560 Func( 3560 Func(
3561 ) 3561 )
3562 END 3562 END
3563 call CheckDefAndScriptSuccess(lines) 3563 v9.CheckDefAndScriptSuccess(lines)
3564 enddef 3564 enddef
3565 3565
3566 func CreateMydict() 3566 func s:CreateMydict()
3567 let g:mydict = {} 3567 let g:mydict = {}
3568 func g:mydict.afunc() 3568 func g:mydict.afunc()
3569 let g:result = self.key 3569 let g:result = self.key
3570 endfunc 3570 endfunc
3571 endfunc 3571 endfunc
3586 def F() 3586 def F()
3587 cal 3587 cal
3588 enddef 3588 enddef
3589 defcompile 3589 defcompile
3590 END 3590 END
3591 CheckScriptFailure(lines, 'E476:') 3591 v9.CheckScriptFailure(lines, 'E476:')
3592 enddef 3592 enddef
3593 3593
3594 if has('python3') 3594 if has('python3')
3595 def Test_python3_heredoc() 3595 def Test_python3_heredoc()
3596 py3 << trim EOF 3596 py3 << trim EOF