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