Mercurial > vim
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 |