patch 8.1.1087: tag stack is incorrect after CTRL-T and then :tag

Problem:    tag stack is incorrect after CTRL-T and then :tag
Solution:   Handle DT_TAG differently. (test by Andy Massimino, closes #3944,
            closes #4177)
This commit is contained in:
Bram Moolenaar
2019-03-30 19:12:02 +01:00
parent abab0b0fdd
commit 7559dcef6c
3 changed files with 81 additions and 3 deletions

View File

@ -504,13 +504,16 @@ do_tag(
tagmatchname = vim_strsave(name);
}
if (type == DT_TAG || type == DT_SELECT || type == DT_JUMP
if (type == DT_SELECT || type == DT_JUMP
#if defined(FEAT_QUICKFIX)
|| type == DT_LTAG
#endif
)
cur_match = MAXCOL - 1;
max_num_matches = cur_match + 1;
if (type == DT_TAG)
max_num_matches = MAXCOL;
else
max_num_matches = cur_match + 1;
/* when the argument starts with '/', use it as a regexp */
if (!no_regexp && *name == '/')
@ -583,7 +586,7 @@ do_tag(
}
else
#endif
if (type == DT_TAG)
if (type == DT_TAG && *tag != NUL)
/*
* If a count is supplied to the ":tag <name>" command, then
* jump to count'th matching tag.

View File

@ -366,4 +366,77 @@ func Test_getsettagstack()
set tags&
endfunc
func Test_tag_with_count()
call writefile([
\ 'test Xtest.h /^void test();$/;" p typeref:typename:void signature:()',
\ ], 'Xtags')
call writefile([
\ 'main Xtest.c /^int main()$/;" f typeref:typename:int signature:()',
\ 'test Xtest.c /^void test()$/;" f typeref:typename:void signature:()',
\ ], 'Ytags')
cal writefile([
\ 'int main()',
\ 'void test()',
\ ], 'Xtest.c')
cal writefile([
\ 'void test();',
\ ], 'Xtest.h')
set tags=Xtags,Ytags
new Xtest.c
let tl = taglist('test', 'Xtest.c')
call assert_equal(tl[0].filename, 'Xtest.c')
call assert_equal(tl[1].filename, 'Xtest.h')
tag test
call assert_equal(bufname('%'), 'Xtest.c')
1tag test
call assert_equal(bufname('%'), 'Xtest.c')
2tag test
call assert_equal(bufname('%'), 'Xtest.h')
set tags&
call delete('Xtags')
call delete('Ytags')
bwipe Xtest.h
bwipe Xtest.c
call delete('Xtest.h')
call delete('Xtest.c')
endfunc
func Test_tagnr_recall()
call writefile([
\ 'test Xtest.h /^void test();$/;" p',
\ 'main Xtest.c /^int main()$/;" f',
\ 'test Xtest.c /^void test()$/;" f',
\ ], 'Xtags')
cal writefile([
\ 'int main()',
\ 'void test()',
\ ], 'Xtest.c')
cal writefile([
\ 'void test();',
\ ], 'Xtest.h')
set tags=Xtags
new Xtest.c
let tl = taglist('test', 'Xtest.c')
call assert_equal(tl[0].filename, 'Xtest.c')
call assert_equal(tl[1].filename, 'Xtest.h')
2tag test
call assert_equal(bufname('%'), 'Xtest.h')
pop
call assert_equal(bufname('%'), 'Xtest.c')
tag
call assert_equal(bufname('%'), 'Xtest.h')
set tag&
call delete('Xtags')
bwipe Xtest.h
bwipe Xtest.c
call delete('Xtest.h')
call delete('Xtest.c')
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@ -775,6 +775,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1087,
/**/
1086,
/**/