xref: /vim-8.2.3635/src/testdir/script_util.vim (revision a6296200)
1*a6296200SBram Moolenaar" Functions shared by the tests for Vim Script
2*a6296200SBram Moolenaar
3*a6296200SBram Moolenaar" Commands to track the execution path of a script
4*a6296200SBram Moolenaarcom!		   XpathINIT  let g:Xpath = ''
5*a6296200SBram Moolenaarcom! -nargs=1 -bar Xpath      let g:Xpath ..= <args>
6*a6296200SBram Moolenaarcom!               XloopINIT  let g:Xloop = 1
7*a6296200SBram Moolenaarcom! -nargs=1 -bar Xloop      let g:Xpath ..= <args> .. g:Xloop
8*a6296200SBram Moolenaarcom!               XloopNEXT  let g:Xloop += 1
9*a6296200SBram Moolenaar
10*a6296200SBram Moolenaar" MakeScript() - Make a script file from a function.			    {{{2
11*a6296200SBram Moolenaar"
12*a6296200SBram Moolenaar" Create a script that consists of the body of the function a:funcname.
13*a6296200SBram Moolenaar" Replace any ":return" by a ":finish", any argument variable by a global
14*a6296200SBram Moolenaar" variable, and every ":call" by a ":source" for the next following argument
15*a6296200SBram Moolenaar" in the variable argument list.  This function is useful if similar tests are
16*a6296200SBram Moolenaar" to be made for a ":return" from a function call or a ":finish" in a script
17*a6296200SBram Moolenaar" file.
18*a6296200SBram Moolenaarfunc MakeScript(funcname, ...)
19*a6296200SBram Moolenaar    let script = tempname()
20*a6296200SBram Moolenaar    execute "redir! >" . script
21*a6296200SBram Moolenaar    execute "function" a:funcname
22*a6296200SBram Moolenaar    redir END
23*a6296200SBram Moolenaar    execute "edit" script
24*a6296200SBram Moolenaar    " Delete the "function" and the "endfunction" lines.  Do not include the
25*a6296200SBram Moolenaar    " word "function" in the pattern since it might be translated if LANG is
26*a6296200SBram Moolenaar    " set.  When MakeScript() is being debugged, this deletes also the debugging
27*a6296200SBram Moolenaar    " output of its line 3 and 4.
28*a6296200SBram Moolenaar    exec '1,/.*' . a:funcname . '(.*)/d'
29*a6296200SBram Moolenaar    /^\d*\s*endfunction\>/,$d
30*a6296200SBram Moolenaar    %s/^\d*//e
31*a6296200SBram Moolenaar    %s/return/finish/e
32*a6296200SBram Moolenaar    %s/\<a:\(\h\w*\)/g:\1/ge
33*a6296200SBram Moolenaar    normal gg0
34*a6296200SBram Moolenaar    let cnt = 0
35*a6296200SBram Moolenaar    while search('\<call\s*\%(\u\|s:\)\w*\s*(.*)', 'W') > 0
36*a6296200SBram Moolenaar	let cnt = cnt + 1
37*a6296200SBram Moolenaar	s/\<call\s*\%(\u\|s:\)\w*\s*(.*)/\='source ' . a:{cnt}/
38*a6296200SBram Moolenaar    endwhile
39*a6296200SBram Moolenaar    g/^\s*$/d
40*a6296200SBram Moolenaar    write
41*a6296200SBram Moolenaar    bwipeout
42*a6296200SBram Moolenaar    return script
43*a6296200SBram Moolenaarendfunc
44*a6296200SBram Moolenaar
45*a6296200SBram Moolenaar" ExecAsScript - Source a temporary script made from a function.	    {{{2
46*a6296200SBram Moolenaar"
47*a6296200SBram Moolenaar" Make a temporary script file from the function a:funcname, ":source" it, and
48*a6296200SBram Moolenaar" delete it afterwards.  However, if an exception is thrown the file may remain,
49*a6296200SBram Moolenaar" the caller should call DeleteTheScript() afterwards.
50*a6296200SBram Moolenaarlet s:script_name = ''
51*a6296200SBram Moolenaarfunction! ExecAsScript(funcname)
52*a6296200SBram Moolenaar    " Make a script from the function passed as argument.
53*a6296200SBram Moolenaar    let s:script_name = MakeScript(a:funcname)
54*a6296200SBram Moolenaar
55*a6296200SBram Moolenaar    " Source and delete the script.
56*a6296200SBram Moolenaar    exec "source" s:script_name
57*a6296200SBram Moolenaar    call delete(s:script_name)
58*a6296200SBram Moolenaar    let s:script_name = ''
59*a6296200SBram Moolenaarendfunction
60*a6296200SBram Moolenaar
61*a6296200SBram Moolenaarfunction! DeleteTheScript()
62*a6296200SBram Moolenaar    if s:script_name
63*a6296200SBram Moolenaar	call delete(s:script_name)
64*a6296200SBram Moolenaar	let s:script_name = ''
65*a6296200SBram Moolenaar    endif
66*a6296200SBram Moolenaarendfunc
67*a6296200SBram Moolenaar
68*a6296200SBram Moolenaarcom! -nargs=1 -bar ExecAsScript call ExecAsScript(<f-args>)
69*a6296200SBram Moolenaar
70