diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2019-08-10 18:35:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-10 18:35:00 +0200 |
commit | d8d371994103a965365349b6ca51a0ce9c2fb4f8 (patch) | |
tree | 2a0b0689e8d0f63a41ef0735123f87dff5d55ba4 /src | |
parent | 5f243fc68ad0ab9c3bdf484c8f2753ec9414bf37 (diff) | |
parent | ac395411cd3f174f3914781f1ce10be15c7b385c (diff) | |
download | rneovim-d8d371994103a965365349b6ca51a0ce9c2fb4f8.tar.gz rneovim-d8d371994103a965365349b6ca51a0ce9c2fb4f8.tar.bz2 rneovim-d8d371994103a965365349b6ca51a0ce9c2fb4f8.zip |
Merge #10737 from blueyed/vim-8.1.0911
vim-patch:8.1.0911: tag line with Ex command cannot have extra fields
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/tag.c | 40 | ||||
-rw-r--r-- | src/nvim/testdir/test_taglist.vim | 44 |
2 files changed, 56 insertions, 28 deletions
diff --git a/src/nvim/tag.c b/src/nvim/tag.c index 504a099df2..88676abc2e 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -2236,8 +2236,13 @@ parse_match ( p = tagp->command; if (find_extra(&p) == OK) { tagp->command_end = p; - p += 2; /* skip ";\"" */ - if (*p++ == TAB) + if (p > tagp->command && p[-1] == '|') { + tagp->command_end = p - 1; // drop trailing bar + } else { + tagp->command_end = p; + } + p += 2; // skip ";\"" + if (*p++ == TAB) { while (ASCII_ISALPHA(*p)) { if (STRNCMP(p, "kind:", 5) == 0) { tagp->tagkind = p + 5; @@ -2253,6 +2258,7 @@ parse_match ( break; p = pt + 1; } + } } if (tagp->tagkind != NULL) { for (p = tagp->tagkind; @@ -2677,22 +2683,30 @@ static int find_extra(char_u **pp) { char_u *str = *pp; - /* Repeat for addresses separated with ';' */ + // Repeat for addresses separated with ';' for (;; ) { - if (ascii_isdigit(*str)) + if (ascii_isdigit(*str)) { str = skipdigits(str); - else if (*str == '/' || *str == '?') { - str = skip_regexp(str + 1, *str, FALSE, NULL); - if (*str != **pp) + } else if (*str == '/' || *str == '?') { + str = skip_regexp(str + 1, *str, false, NULL); + if (*str != **pp) { str = NULL; - else - ++str; - } else - str = NULL; + } else { + str++; + } + } else { + // not a line number or search string, look for terminator. + str = (char_u *)strstr((char *)str, "|;\""); + if (str != NULL) { + str++; + break; + } + } if (str == NULL || *str != ';' - || !(ascii_isdigit(str[1]) || str[1] == '/' || str[1] == '?')) + || !(ascii_isdigit(str[1]) || str[1] == '/' || str[1] == '?')) { break; - ++str; /* skip ';' */ + } + str++; // skip ';' } if (str != NULL && STRNCMP(str, ";\"", 2) == 0) { diff --git a/src/nvim/testdir/test_taglist.vim b/src/nvim/testdir/test_taglist.vim index fb8c6c85cd..eb64e59509 100644 --- a/src/nvim/testdir/test_taglist.vim +++ b/src/nvim/testdir/test_taglist.vim @@ -5,7 +5,9 @@ func Test_taglist() \ "FFoo\tXfoo\t1", \ "FBar\tXfoo\t2", \ "BFoo\tXbar\t1", - \ "BBar\tXbar\t2" + \ "BBar\tXbar\t2", + \ "Kindly\tXbar\t3;\"\tv\tfile:", + \ "Command\tXbar\tcall cursor(3, 4)|;\"\td", \ ], 'Xtags') set tags=Xtags split Xtext @@ -15,6 +17,18 @@ func Test_taglist() call assert_equal(['FFoo', 'BFoo'], map(taglist("Foo", "Xfoo"), {i, v -> v.name})) call assert_equal(['BFoo', 'FFoo'], map(taglist("Foo", "Xbar"), {i, v -> v.name})) + let kind = taglist("Kindly") + call assert_equal(1, len(kind)) + call assert_equal('v', kind[0]['kind']) + call assert_equal('3', kind[0]['cmd']) + call assert_equal(1, kind[0]['static']) + call assert_equal('Xbar', kind[0]['filename']) + + let cmd = taglist("Command") + call assert_equal(1, len(cmd)) + call assert_equal('d', cmd[0]['kind']) + call assert_equal('call cursor(3, 4)', cmd[0]['cmd']) + call delete('Xtags') set tags& bwipe @@ -65,20 +79,6 @@ func Test_tags_too_long() tags endfunc -" For historical reasons we support a tags file where the last line is missing -" the newline. -func Test_tagsfile_without_trailing_newline() - call writefile(["Foo\tfoo\t1"], 'Xtags', 'b') - set tags=Xtags - - let tl = taglist('.*') - call assert_equal(1, len(tl)) - call assert_equal('Foo', tl[0].name) - - call delete('Xtags') - set tags& -endfunc - func Test_tagfiles() call assert_equal([], tagfiles()) @@ -102,3 +102,17 @@ func Test_tagfiles() call delete('Xtags2') bd endfunc + +" For historical reasons we support a tags file where the last line is missing +" the newline. +func Test_tagsfile_without_trailing_newline() + call writefile(["Foo\tfoo\t1"], 'Xtags', 'b') + set tags=Xtags + + let tl = taglist('.*') + call assert_equal(1, len(tl)) + call assert_equal('Foo', tl[0].name) + + call delete('Xtags') + set tags& +endfunc |