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