" Test 'tagfunc' import './vim9.vim' as v9 source check.vim source screendump.vim func TagFunc(pat, flag, info) let g:tagfunc_args = [a:pat, a:flag, a:info] let tags = [] for num in range(1,10) let tags += [{ \ 'cmd': '2', 'name': 'nothing'.num, 'kind': 'm', \ 'filename': 'Xfile1', 'user_data': 'somedata'.num, \}] endfor return tags endfunc func Test_tagfunc() set tagfunc=TagFunc new Xfile1 call setline(1, ['empty', 'one()', 'empty']) write call assert_equal({'cmd': '2', 'static': 0, \ 'name': 'nothing2', 'user_data': 'somedata2', \ 'kind': 'm', 'filename': 'Xfile1'}, taglist('.')[1]) call settagstack(win_getid(), {'items': []}) tag arbitrary call assert_equal('arbitrary', g:tagfunc_args[0]) call assert_equal('', g:tagfunc_args[1]) call assert_equal('somedata1', gettagstack().items[0].user_data) 5tag arbitrary call assert_equal('arbitrary', g:tagfunc_args[0]) call assert_equal('', g:tagfunc_args[1]) call assert_equal('somedata5', gettagstack().items[1].user_data) pop tag call assert_equal('arbitrary', g:tagfunc_args[0]) call assert_equal('', g:tagfunc_args[1]) call assert_equal('somedata5', gettagstack().items[1].user_data) let g:tagfunc_args=[] execute "normal! \" call assert_equal('one', g:tagfunc_args[0]) call assert_equal('c', g:tagfunc_args[1]) let g:tagfunc_args=[] execute "tag /foo$" call assert_equal('foo$', g:tagfunc_args[0]) call assert_equal('r', g:tagfunc_args[1]) set cpt=t let g:tagfunc_args=[] execute "normal! i\\" call assert_equal('\<\k\k', g:tagfunc_args[0]) call assert_equal('cir', g:tagfunc_args[1]) call assert_equal('nothing1', getline('.')[0:7]) let g:tagfunc_args=[] execute "normal! ono\\\" call assert_equal('\\ g:TagFunc1(21,\ a,\ b,\ c) new let g:TagFunc1Args = [] call assert_fails("tag a17", "E117:") call assert_equal([], g:TagFunc1Args) bw! " Test for using a script local function set tagfunc=ScriptLocalTagFunc new let g:ScriptLocalFuncArgs = [] call assert_fails('tag a15', 'E433:') call assert_equal(['a15', '', {}], g:ScriptLocalFuncArgs) bw! " Test for using a script local funcref variable let Fn = function("s:ScriptLocalTagFunc") let &tagfunc= Fn new let g:ScriptLocalFuncArgs = [] call assert_fails('tag a16', 'E433:') call assert_equal(['a16', '', {}], g:ScriptLocalFuncArgs) bw! " Test for using a string(script local funcref variable) let Fn = function("s:ScriptLocalTagFunc") let &tagfunc= string(Fn) new let g:ScriptLocalFuncArgs = [] call assert_fails('tag a16', 'E433:') call assert_equal(['a16', '', {}], g:ScriptLocalFuncArgs) bw! " set 'tagfunc' to a partial with dict. This used to cause a crash. func SetTagFunc() let params = {'tagfn': function('g:DictTagFunc')} let &tagfunc = params.tagfn endfunc func g:DictTagFunc(_) dict endfunc call SetTagFunc() new call SetTagFunc() bw call test_garbagecollect_now() new set tagfunc= wincmd w set tagfunc= :%bw! delfunc g:DictTagFunc delfunc SetTagFunc " Vim9 tests let lines =<< trim END vim9script def Vim9tagFunc(callnr: number, pat: string, flags: string, info: dict): any g:Vim9tagFuncArgs = [callnr, pat, flags, info] return null enddef # Test for using a def function with completefunc set tagfunc=function('Vim9tagFunc',\ [60]) new g:Vim9tagFuncArgs = [] assert_fails('tag a10', 'E433:') assert_equal([60, 'a10', '', {}], g:Vim9tagFuncArgs) # Test for using a global function name &tagfunc = g:TagFunc2 new g:TagFunc2Args = [] assert_fails('tag a11', 'E433:') assert_equal(['a11', '', {}], g:TagFunc2Args) bw! # Test for using a script-local function name def LocalTagFunc(pat: string, flags: string, info: dict ): any g:LocalTagFuncArgs = [pat, flags, info] return null enddef &tagfunc = LocalTagFunc new g:LocalTagFuncArgs = [] assert_fails('tag a12', 'E433:') assert_equal(['a12', '', {}], g:LocalTagFuncArgs) bw! END call v9.CheckScriptSuccess(lines) " cleanup delfunc TagFunc1 delfunc TagFunc2 set tagfunc& %bw! endfunc func Test_tagfunc_wipes_buffer() func g:Tag0unc0(t,f,o) bwipe endfunc set tagfunc=g:Tag0unc0 new cal assert_fails('tag 0', 'E987:') delfunc g:Tag0unc0 set tagfunc= endfunc func Test_tagfunc_closes_window() split any func MytagfuncClose(pat, flags, info) close return [{'name' : 'mytag', 'filename' : 'Xtest', 'cmd' : '1'}] endfunc set tagfunc=MytagfuncClose call assert_fails('tag xyz', 'E1299:') set tagfunc= endfunc " vim: shiftwidth=2 sts=2 expandtab