blob: 9d09c63f6ead38ca3b50a461c9ee4bc5ac68a290 [file] [log] [blame]
Bram Moolenaard8448622022-01-07 21:39:52 +00001" Test import/export of the Vim9 script language.
2
3source check.vim
4source term_util.vim
5source vim9.vim
6
7let s:export_script_lines =<< trim END
8 vim9script
9 var name: string = 'bob'
10 def Concat(arg: string): string
11 return name .. arg
12 enddef
13 g:result = Concat('bie')
14 g:localname = name
15
16 export const CONST = 1234
17 export var exported = 9876
18 export var exp_name = 'John'
19 export def Exported(): string
20 return 'Exported'
21 enddef
22 export def ExportedValue(): number
23 return exported
24 enddef
25 export def ExportedInc()
26 exported += 5
27 enddef
28 export final theList = [1]
29END
30
31def Undo_export_script_lines()
32 unlet g:result
33 unlet g:localname
34enddef
35
36def Test_vim9_import_export()
37 writefile(s:export_script_lines, 'Xexport.vim')
38 var import_script_lines =<< trim END
39 vim9script
40 var dir = './'
41 var ext = ".vim"
42 import dir .. 'Xexport' .. ext as expo
43
44 g:exported1 = expo.exported
45 expo.exported += 3
46 g:exported2 = expo.exported
47 g:exported3 = expo.ExportedValue()
48
49 expo.ExportedInc()
50 g:exported_i1 = expo.exported
51 g:exported_i2 = expo.ExportedValue()
52
53 expo.exported = 11
54 g:exported_s1 = expo.exported
55 g:exported_s2 = expo.ExportedValue()
56
57 g:imported_func = expo.Exported()
58
59 def GetExported(): string
60 var local_dict = {ref: expo.Exported}
61 return local_dict.ref()
62 enddef
63 g:funcref_result = GetExported()
64
65 g:imported_name = expo.exp_name
66 expo.exp_name ..= ' Doe'
67 g:imported_name_appended = expo.exp_name
68 g:exported_later = expo.exported
69
70 expo.theList->add(2)
71 assert_equal([1, 2], expo.theList)
72 END
73 writefile(import_script_lines, 'Ximport.vim')
74 source Ximport.vim
75
76 assert_equal('bobbie', g:result)
77 assert_equal('bob', g:localname)
78 assert_equal(9876, g:exported1)
79 assert_equal(9879, g:exported2)
80 assert_equal(9879, g:exported3)
81
82 assert_equal(9884, g:exported_i1)
83 assert_equal(9884, g:exported_i2)
84
85 assert_equal(11, g:exported_s1)
86 assert_equal(11, g:exported_s2)
87 assert_equal(11, g:exported_later)
88
89 assert_equal('Exported', g:imported_func)
90 assert_equal('Exported', g:funcref_result)
91 assert_equal('John', g:imported_name)
92 assert_equal('John Doe', g:imported_name_appended)
93 assert_false(exists('g:name'))
94
95 Undo_export_script_lines()
96 unlet g:exported1
97 unlet g:exported2
98 unlet g:exported3
99 unlet g:exported_i1
100 unlet g:exported_i2
101 unlet g:exported_later
102 unlet g:imported_func
103 unlet g:imported_name g:imported_name_appended
104 delete('Ximport.vim')
105
106 # similar, with line breaks
107 var import_line_break_script_lines =<< trim END
108 vim9script
109 import './Xexport.vim'
110 as expo
111 g:exported = expo.exported
112 expo.exported += 7
113 g:exported_added = expo.exported
114 g:imported_func = expo.Exported()
115 END
116 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
117 source Ximport_lbr.vim
118
119 assert_equal(11, g:exported)
120 assert_equal(18, g:exported_added)
121 assert_equal('Exported', g:imported_func)
122
123 # exported script not sourced again
124 assert_false(exists('g:result'))
125 unlet g:exported
126 unlet g:exported_added
127 unlet g:imported_func
128 delete('Ximport_lbr.vim')
129
130 var line_break_before_dot =<< trim END
131 vim9script
132 import './Xexport.vim' as expo
133 g:exported = expo
134 .exported
135 END
136 writefile(line_break_before_dot, 'Ximport_lbr_before_dot.vim')
137 assert_fails('source Ximport_lbr_before_dot.vim', 'E1060:', '', 3)
138 delete('Ximport_lbr_before_dot.vim')
139
140 var line_break_after_dot =<< trim END
141 vim9script
142 import './Xexport.vim' as expo
143 g:exported = expo.
144 exported
145 END
146 writefile(line_break_after_dot, 'Ximport_lbr_after_dot.vim')
147 assert_fails('source Ximport_lbr_after_dot.vim', 'E1074:', '', 3)
148 delete('Ximport_lbr_after_dot.vim')
149
150 var import_star_as_lines =<< trim END
151 vim9script
152 import './Xexport.vim' as Export
153 def UseExport()
154 g:exported_def = Export.exported
155 enddef
156 g:exported_script = Export.exported
157 assert_equal(1, exists('Export.exported'))
158 assert_equal(0, exists('Export.notexported'))
159 UseExport()
160 END
161 writefile(import_star_as_lines, 'Ximport.vim')
162 source Ximport.vim
163
164 assert_equal(18, g:exported_def)
165 assert_equal(18, g:exported_script)
166 unlet g:exported_def
167 unlet g:exported_script
168
169 var import_star_as_lines_no_dot =<< trim END
170 vim9script
171 import './Xexport.vim' as Export
172 def Func()
173 var dummy = 1
174 var imported = Export + dummy
175 enddef
176 defcompile
177 END
178 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
179 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
180
181 var import_star_as_lines_dot_space =<< trim END
182 vim9script
183 import './Xexport.vim' as Export
184 def Func()
185 var imported = Export . exported
186 enddef
187 defcompile
188 END
189 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
190 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
191
192 var import_func_duplicated =<< trim END
193 vim9script
194 import './Xexport.vim' as expo
195 import './Xexport.vim' as expo
196
197 ExportedInc()
198 END
199 writefile(import_func_duplicated, 'Ximport.vim')
200 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
201
202 var import_star_as_duplicated =<< trim END
203 vim9script
204 import './Xexport.vim' as Export
205 var some = 'other'
206 import './Xexport.vim' as Export
207 defcompile
208 END
209 writefile(import_star_as_duplicated, 'Ximport.vim')
210 assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
211
212 var import_star_as_lines_script_no_dot =<< trim END
213 vim9script
214 import './Xexport.vim' as Export
215 g:imported_script = Export exported
216 END
217 writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
218 assert_fails('source Ximport.vim', 'E1060: Expected dot after name: Export exported')
219
220 var import_star_as_lines_script_space_after_dot =<< trim END
221 vim9script
222 import './Xexport.vim' as Export
223 g:imported_script = Export. exported
224 END
225 writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
226 assert_fails('source Ximport.vim', 'E1074:')
227
228 var import_star_as_lines_missing_name =<< trim END
229 vim9script
230 import './Xexport.vim' as Export
231 def Func()
232 var imported = Export.
233 enddef
234 defcompile
235 END
236 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
237 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
238
239 var import_star_as_lbr_lines =<< trim END
240 vim9script
241 import './Xexport.vim'
242 as Export
243 def UseExport()
244 g:exported = Export.exported
245 enddef
246 UseExport()
247 END
248 writefile(import_star_as_lbr_lines, 'Ximport.vim')
249 source Ximport.vim
250 assert_equal(18, g:exported)
251 unlet g:exported
252
253 # try to use something that exists but is not exported
254 var import_not_exported_lines =<< trim END
255 vim9script
256 import './Xexport.vim' as expo
257 echo expo.name
258 END
259 writefile(import_not_exported_lines, 'Ximport.vim')
260 assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
261
262 # try to import something that is already defined
263 var import_already_defined =<< trim END
264 vim9script
265 var exported = 'something'
266 import './Xexport.vim' as exported
267 END
268 writefile(import_already_defined, 'Ximport.vim')
269 assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
270
271 # try changing an imported const
272 var import_assign_to_const =<< trim END
273 vim9script
274 import './Xexport.vim' as expo
275 def Assign()
276 expo.CONST = 987
277 enddef
278 defcompile
279 END
280 writefile(import_assign_to_const, 'Ximport.vim')
281 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
282
283 # try changing an imported final
284 var import_assign_to_final =<< trim END
285 vim9script
286 import './Xexport.vim' as expo
287 def Assign()
288 expo.theList = [2]
289 enddef
290 defcompile
291 END
292 writefile(import_assign_to_final, 'Ximport.vim')
293 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
294
295 var import_no_as_lines =<< trim END
296 vim9script
297 import './Xexport.vim' name
298 END
299 writefile(import_no_as_lines, 'Ximport.vim')
300 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
301
302 var import_invalid_string_lines =<< trim END
303 vim9script
304 import Xexport.vim
305 END
306 writefile(import_invalid_string_lines, 'Ximport.vim')
307 assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
308
309 var import_wrong_name_lines =<< trim END
310 vim9script
311 import './XnoExport.vim'
312 END
313 writefile(import_wrong_name_lines, 'Ximport.vim')
314 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
315
316 var import_redefining_lines =<< trim END
317 vim9script
318 import './Xexport.vim' as exported
319 var exported = 5
320 END
321 writefile(import_redefining_lines, 'Ximport.vim')
322 assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
323
324 var import_assign_wrong_type_lines =<< trim END
325 vim9script
326 import './Xexport.vim' as expo
327 expo.exported = 'xxx'
328 END
329 writefile(import_assign_wrong_type_lines, 'Ximport.vim')
330 assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
331
332 var import_assign_const_lines =<< trim END
333 vim9script
334 import './Xexport.vim' as expo
335 expo.CONST = 4321
336 END
337 writefile(import_assign_const_lines, 'Ximport.vim')
338 assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
339
340 delete('Ximport.vim')
341 delete('Ximport3.vim')
342 delete('Xexport.vim')
343
344 # Check that in a Vim9 script 'cpo' is set to the Vim default.
345 # Flags added or removed are also applied to the restored value.
346 set cpo=abcd
347 var lines =<< trim END
348 vim9script
349 g:cpo_in_vim9script = &cpo
350 set cpo+=f
351 set cpo-=c
352 g:cpo_after_vim9script = &cpo
353 END
354 writefile(lines, 'Xvim9_script')
355 source Xvim9_script
356 assert_equal('fabd', &cpo)
357 set cpo&vim
358 assert_equal(&cpo, g:cpo_in_vim9script)
359 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
360 assert_equal(newcpo, g:cpo_after_vim9script)
361
362 delete('Xvim9_script')
363enddef
364
365def Test_import_funcref()
366 var lines =<< trim END
367 vim9script
368 export def F(): number
369 return 42
370 enddef
371 export const G = F
372 END
373 writefile(lines, 'Xlib.vim')
374
375 lines =<< trim END
376 vim9script
377 import './Xlib.vim' as lib
378 const Foo = lib.G()
379 assert_equal(42, Foo)
380
381 def DoTest()
382 const Goo = lib.G()
383 assert_equal(42, Goo)
384 enddef
385 DoTest()
386 END
387 CheckScriptSuccess(lines)
388
389 delete('Xlib.vim')
390enddef
391
392def Test_import_fails()
393 writefile([], 'Xfoo.vim')
394 var lines =<< trim END
395 import './Xfoo.vim' as foo
396 foo = 'bar'
397 END
398 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
399 lines =<< trim END
400 vim9script
401 import './Xfoo.vim' as foo
402 var that = foo
403 END
404 CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
405
406 lines =<< trim END
407 vim9script
408 import './Xfoo.vim' as 9foo
409 END
410 CheckScriptFailure(lines, 'E1047:')
411 lines =<< trim END
412 vim9script
413 import './Xfoo.vim' as the#foo
414 END
415 CheckScriptFailure(lines, 'E1047:')
416 lines =<< trim END
417 vim9script
418 import './Xfoo.vim' as g:foo
419 END
420 CheckScriptFailure(lines, 'E1047:')
421
422 delete('Xfoo.vim')
423
424 lines =<< trim END
425 vim9script
426 def TheFunc()
427 echo 'the func'
428 enddef
429 export var Ref = TheFunc
430 END
431 writefile([], 'Xthat.vim')
432 lines =<< trim END
433 import './Xthat.vim' as That
434 That()
435 END
436 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
437
438 mkdir('Ximport')
439
440 writefile(['vim9script'], 'Ximport/.vim')
441 lines =<< trim END
442 vim9script
443 import './Ximport/.vim'
444 END
445 CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
446 lines =<< trim END
447 vim9script
448 import './Ximport/.vim' as vim
449 END
450 CheckScriptSuccess(lines)
451
452 writefile(['vim9script'], 'Ximport/.vimrc')
453 lines =<< trim END
454 vim9script
455 import './Ximport/.vimrc'
456 END
457 CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
458 lines =<< trim END
459 vim9script
460 import './Ximport/.vimrc' as vimrc
461 END
462 CheckScriptSuccess(lines)
463
464 delete('Ximport', 'rf')
465enddef
466
467func g:Trigger()
468 source Ximport.vim
469 return "echo 'yes'\<CR>"
470endfunc
471
472def Test_import_export_expr_map()
473 # check that :import and :export work when buffer is locked
474 var export_lines =<< trim END
475 vim9script
476 export def That(): string
477 return 'yes'
478 enddef
479 END
480 writefile(export_lines, 'Xexport_that.vim')
481
482 var import_lines =<< trim END
483 vim9script
484 import './Xexport_that.vim' as that
485 assert_equal('yes', that.That())
486 END
487 writefile(import_lines, 'Ximport.vim')
488
489 nnoremap <expr> trigger g:Trigger()
490 feedkeys('trigger', "xt")
491
492 delete('Xexport_that.vim')
493 delete('Ximport.vim')
494 nunmap trigger
495enddef
496
497def Test_import_in_filetype()
498 # check that :import works when the buffer is locked
499 mkdir('ftplugin', 'p')
500 var export_lines =<< trim END
501 vim9script
502 export var That = 'yes'
503 END
504 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
505
506 var import_lines =<< trim END
507 vim9script
508 import './Xexport_ft.vim' as ft
509 assert_equal('yes', ft.That)
510 g:did_load_mytpe = 1
511 END
512 writefile(import_lines, 'ftplugin/qf.vim')
513
514 var save_rtp = &rtp
515 &rtp = getcwd() .. ',' .. &rtp
516
517 filetype plugin on
518 copen
519 assert_equal(1, g:did_load_mytpe)
520
521 quit!
522 delete('Xexport_ft.vim')
523 delete('ftplugin', 'rf')
524 &rtp = save_rtp
525enddef
526
527def Test_use_import_in_mapping()
528 var lines =<< trim END
529 vim9script
530 export def Funcx()
531 g:result = 42
532 enddef
533 END
534 writefile(lines, 'XsomeExport.vim')
535 lines =<< trim END
536 vim9script
537 import './XsomeExport.vim' as some
538 var Funcy = some.Funcx
539 nnoremap <F3> :call <sid>Funcy()<cr>
540 END
541 writefile(lines, 'Xmapscript.vim')
542
543 source Xmapscript.vim
544 feedkeys("\<F3>", "xt")
545 assert_equal(42, g:result)
546
547 unlet g:result
548 delete('XsomeExport.vim')
549 delete('Xmapscript.vim')
550 nunmap <F3>
551enddef
552
553def Test_export_fails()
554 CheckScriptFailure(['export var some = 123'], 'E1042:')
555 CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
556 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
557
558 assert_fails('export something', 'E1043:')
559enddef
560
561func Test_import_fails_without_script()
562 CheckRunVimInTerminal
563
564 " call indirectly to avoid compilation error for missing functions
565 call Run_Test_import_fails_on_command_line()
566endfunc
567
568def Run_Test_import_fails_on_command_line()
569 var export =<< trim END
570 vim9script
571 export def Foo(): number
572 return 0
573 enddef
574 END
575 writefile(export, 'XexportCmd.vim')
576
577 var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
578 rows: 6, wait_for_ruler: 0})
579 WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
580
581 delete('XexportCmd.vim')
582 StopVimInTerminal(buf)
583enddef
584
585def Test_vim9_reload_noclear()
586 var lines =<< trim END
587 vim9script
588 export var exported = 'thexport'
589
590 export def TheFunc(x = 0)
591 enddef
592 END
593 writefile(lines, 'XExportReload')
594 lines =<< trim END
595 vim9script noclear
596 g:loadCount += 1
597 var s:reloaded = 'init'
598 import './XExportReload' as exp
599
600 def Again(): string
601 return 'again'
602 enddef
603
604 exp.TheFunc()
605
606 if exists('s:loaded') | finish | endif
607 var s:loaded = true
608
609 var s:notReloaded = 'yes'
610 s:reloaded = 'first'
611 def g:Values(): list<string>
612 return [s:reloaded, s:notReloaded, Again(), Once(), exp.exported]
613 enddef
614
615 def Once(): string
616 return 'once'
617 enddef
618 END
619 writefile(lines, 'XReloaded')
620 g:loadCount = 0
621 source XReloaded
622 assert_equal(1, g:loadCount)
623 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
624 source XReloaded
625 assert_equal(2, g:loadCount)
626 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
627 source XReloaded
628 assert_equal(3, g:loadCount)
629 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
630
631 delete('XReloaded')
632 delete('XExportReload')
633 delfunc g:Values
634 unlet g:loadCount
635
636 lines =<< trim END
637 vim9script
638 def Inner()
639 enddef
640 END
641 lines->writefile('XreloadScript.vim')
642 source XreloadScript.vim
643
644 lines =<< trim END
645 vim9script
646 def Outer()
647 def Inner()
648 enddef
649 enddef
650 defcompile
651 END
652 lines->writefile('XreloadScript.vim')
653 source XreloadScript.vim
654
655 delete('XreloadScript.vim')
656enddef
657
658def Test_vim9_reload_import()
659 var lines =<< trim END
660 vim9script
661 const var = ''
662 var valone = 1234
663 def MyFunc(arg: string)
664 valone = 5678
665 enddef
666 END
667 var morelines =<< trim END
668 var valtwo = 222
669 export def GetValtwo(): number
670 return valtwo
671 enddef
672 END
673 writefile(lines + morelines, 'Xreload.vim')
674 source Xreload.vim
675 source Xreload.vim
676 source Xreload.vim
677
678 # cannot declare a var twice
679 lines =<< trim END
680 vim9script
681 var valone = 1234
682 var valone = 5678
683 END
684 writefile(lines, 'Xreload.vim')
685 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
686
687 delete('Xreload.vim')
688 delete('Ximport.vim')
689enddef
690
691" if a script is reloaded with a script-local variable that changed its type, a
692" compiled function using that variable must fail.
693def Test_script_reload_change_type()
694 var lines =<< trim END
695 vim9script noclear
696 var str = 'string'
697 def g:GetStr(): string
698 return str .. 'xxx'
699 enddef
700 END
701 writefile(lines, 'Xreload.vim')
702 source Xreload.vim
703 echo g:GetStr()
704
705 lines =<< trim END
706 vim9script noclear
707 var str = 1234
708 END
709 writefile(lines, 'Xreload.vim')
710 source Xreload.vim
711 assert_fails('echo g:GetStr()', 'E1150:')
712
713 delfunc g:GetStr
714 delete('Xreload.vim')
715enddef
716
717" Define CallFunc so that the test can be compiled
718command CallFunc echo 'nop'
719
720def Test_script_reload_from_function()
721 var lines =<< trim END
722 vim9script
723
724 if exists('g:loaded')
725 finish
726 endif
727 g:loaded = 1
728 delcommand CallFunc
729 command CallFunc Func()
730 def Func()
731 so XreloadFunc.vim
732 g:didTheFunc = 1
733 enddef
734 END
735 writefile(lines, 'XreloadFunc.vim')
736 source XreloadFunc.vim
737 CallFunc
738 assert_equal(1, g:didTheFunc)
739
740 delete('XreloadFunc.vim')
741 delcommand CallFunc
742 unlet g:loaded
743 unlet g:didTheFunc
744enddef
745
746def s:RetSome(): string
747 return 'some'
748enddef
749
750" Not exported function that is referenced needs to be accessed by the
751" script-local name.
752def Test_vim9_funcref()
753 var sortlines =<< trim END
754 vim9script
755 def Compare(i1: number, i2: number): number
756 return i2 - i1
757 enddef
758
759 export def FastSort(): list<number>
760 return range(5)->sort(Compare)
761 enddef
762
763 export def GetString(arg: string): string
764 return arg
765 enddef
766 END
767 writefile(sortlines, 'Xsort.vim')
768
769 var lines =<< trim END
770 vim9script
771 import './Xsort.vim'
772 def Test()
773 g:result = Xsort.FastSort()
774 enddef
775 Test()
776
777 # using a function imported with "as"
778 import './Xsort.vim' as anAlias
779 assert_equal('yes', anAlias.GetString('yes'))
780
781 # using the function from a compiled function
782 def TestMore(): string
783 var s = s:anAlias.GetString('foo')
784 return s .. anAlias.GetString('bar')
785 enddef
786 assert_equal('foobar', TestMore())
787
788 # error when using a function that isn't exported
789 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
790 END
791 writefile(lines, 'Xscript.vim')
792
793 source Xscript.vim
794 assert_equal([4, 3, 2, 1, 0], g:result)
795
796 unlet g:result
797 delete('Xsort.vim')
798 delete('Xscript.vim')
799
800 var Funcref = function('s:RetSome')
801 assert_equal('some', Funcref())
802enddef
803
804" Check that when searching for "FilterFunc" it finds the import in the
805" script where FastFilter() is called from, both as a string and as a direct
806" function reference.
807def Test_vim9_funcref_other_script()
808 var filterLines =<< trim END
809 vim9script
810 export def FilterFunc(idx: number, val: number): bool
811 return idx % 2 == 1
812 enddef
813 export def FastFilter(): list<number>
814 return range(10)->filter('FilterFunc(v:key, v:val)')
815 enddef
816 export def FastFilterDirect(): list<number>
817 return range(10)->filter(FilterFunc)
818 enddef
819 END
820 writefile(filterLines, 'Xfilter.vim')
821
822 var lines =<< trim END
823 vim9script
824 import './Xfilter.vim' as filter
825 def Test()
826 var x: list<number> = filter.FastFilter()
827 enddef
828 Test()
829 def TestDirect()
830 var x: list<number> = filter.FastFilterDirect()
831 enddef
832 TestDirect()
833 END
834 CheckScriptSuccess(lines)
835 delete('Xfilter.vim')
836enddef
837
838def Test_import_absolute()
839 var import_lines = [
840 'vim9script',
841 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
842 'def UseExported()',
843 ' g:imported_abs = abs.exported',
844 ' abs.exported = 8888',
845 ' g:imported_after = abs.exported',
846 'enddef',
847 'UseExported()',
848 'g:import_disassembled = execute("disass UseExported")',
849 ]
850 writefile(import_lines, 'Ximport_abs.vim')
851 writefile(s:export_script_lines, 'Xexport_abs.vim')
852
853 source Ximport_abs.vim
854
855 assert_equal(9876, g:imported_abs)
856 assert_equal(8888, g:imported_after)
857 assert_match('<SNR>\d\+_UseExported\_s*' ..
858 'g:imported_abs = abs.exported\_s*' ..
859 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
860 '1 STOREG g:imported_abs\_s*' ..
861 'abs.exported = 8888\_s*' ..
862 '2 PUSHNR 8888\_s*' ..
863 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
864 'g:imported_after = abs.exported\_s*' ..
865 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
866 '5 STOREG g:imported_after',
867 g:import_disassembled)
868
869 Undo_export_script_lines()
870 unlet g:imported_abs
871 unlet g:import_disassembled
872
873 delete('Ximport_abs.vim')
874 delete('Xexport_abs.vim')
875enddef
876
877def Test_import_rtp()
878 var import_lines = [
879 'vim9script',
880 'import "Xexport_rtp.vim" as rtp',
881 'g:imported_rtp = rtp.exported',
882 ]
883 writefile(import_lines, 'Ximport_rtp.vim')
884 mkdir('import', 'p')
885 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
886
887 var save_rtp = &rtp
888 &rtp = getcwd()
889 source Ximport_rtp.vim
890 &rtp = save_rtp
891
892 assert_equal(9876, g:imported_rtp)
893
894 Undo_export_script_lines()
895 unlet g:imported_rtp
896 delete('Ximport_rtp.vim')
897 delete('import', 'rf')
898enddef
899
900def Test_import_compile_error()
901 var export_lines = [
902 'vim9script',
903 'export def ExpFunc(): string',
904 ' return notDefined',
905 'enddef',
906 ]
907 writefile(export_lines, 'Xexported.vim')
908
909 var import_lines = [
910 'vim9script',
911 'import "./Xexported.vim" as expo',
912 'def ImpFunc()',
913 ' echo expo.ExpFunc()',
914 'enddef',
915 'defcompile',
916 ]
917 writefile(import_lines, 'Ximport.vim')
918
919 try
920 source Ximport.vim
921 catch /E1001/
922 # Error should be before the Xexported.vim file.
923 assert_match('E1001: Variable not found: notDefined', v:exception)
924 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
925 endtry
926
927 delete('Xexported.vim')
928 delete('Ximport.vim')
929enddef
930
931def Test_func_overrules_import_fails()
932 var export_lines =<< trim END
933 vim9script
934 export def Func()
935 echo 'imported'
936 enddef
937 END
938 writefile(export_lines, 'XexportedFunc.vim')
939
940 var lines =<< trim END
941 vim9script
942 import './XexportedFunc.vim' as Func
943 def Func()
944 echo 'local to function'
945 enddef
946 END
947 CheckScriptFailure(lines, 'E1236:')
948
949 lines =<< trim END
950 vim9script
951 import './XexportedFunc.vim' as Func
952 def Outer()
953 def Func()
954 echo 'local to function'
955 enddef
956 enddef
957 defcompile
958 END
959 CheckScriptFailure(lines, 'E1236:')
960
961 delete('XexportedFunc.vim')
962enddef
963
964def Test_source_vim9_from_legacy()
965 var vim9_lines =<< trim END
966 vim9script
967 var local = 'local'
968 g:global = 'global'
969 export var exported = 'exported'
970 export def GetText(): string
971 return 'text'
972 enddef
973 END
974 writefile(vim9_lines, 'Xvim9_script.vim')
975
976 var legacy_lines =<< trim END
977 source Xvim9_script.vim
978
979 call assert_false(exists('local'))
980 call assert_false(exists('exported'))
981 call assert_false(exists('s:exported'))
982 call assert_equal('global', global)
983 call assert_equal('global', g:global)
984
985 "" imported variable becomes script-local
986 "import exported from './Xvim9_script.vim'
987 "call assert_equal('exported', s:exported)
988 "call assert_false(exists('exported'))
989
990 "" imported function becomes script-local
991 "import GetText from './Xvim9_script.vim'
992 "call assert_equal('text', s:GetText())
993 "call assert_false(exists('*GetText'))
994 END
995 writefile(legacy_lines, 'Xlegacy_script.vim')
996
997 source Xlegacy_script.vim
998 assert_equal('global', g:global)
999 unlet g:global
1000
1001 delete('Xlegacy_script.vim')
1002 delete('Xvim9_script.vim')
1003enddef
1004
1005def Test_cmdline_win()
1006 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
1007 # the command line window.
1008 mkdir('rtp/syntax', 'p')
1009 var export_lines =<< trim END
1010 vim9script
1011 export var That = 'yes'
1012 END
1013 writefile(export_lines, 'rtp/syntax/Xexport.vim')
1014 var import_lines =<< trim END
1015 vim9script
1016 import './Xexport.vim' as exp
1017 echo exp.That
1018 END
1019 writefile(import_lines, 'rtp/syntax/vim.vim')
1020 var save_rtp = &rtp
1021 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
1022 syntax on
1023 augroup CmdWin
1024 autocmd CmdwinEnter * g:got_there = 'yes'
1025 augroup END
1026 # this will open and also close the cmdline window
1027 feedkeys('q:', 'xt')
1028 assert_equal('yes', g:got_there)
1029
1030 augroup CmdWin
1031 au!
1032 augroup END
1033 &rtp = save_rtp
1034 delete('rtp', 'rf')
1035enddef
1036
1037def Test_import_gone_when_sourced_twice()
1038 var exportlines =<< trim END
1039 vim9script
1040 if exists('g:guard')
1041 finish
1042 endif
1043 g:guard = 1
1044 export var name = 'someName'
1045 END
1046 writefile(exportlines, 'XexportScript.vim')
1047
1048 var lines =<< trim END
1049 vim9script
1050 import './XexportScript.vim' as expo
1051 def g:GetName(): string
1052 return expo.name
1053 enddef
1054 END
1055 writefile(lines, 'XscriptImport.vim')
1056 so XscriptImport.vim
1057 assert_equal('someName', g:GetName())
1058
1059 so XexportScript.vim
1060 assert_fails('call g:GetName()', 'E1149:')
1061
1062 delfunc g:GetName
1063 delete('XexportScript.vim')
1064 delete('XscriptImport.vim')
1065 unlet g:guard
1066enddef
1067
1068
1069" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker