aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2019-08-10 18:35:00 +0200
committerGitHub <noreply@github.com>2019-08-10 18:35:00 +0200
commitd8d371994103a965365349b6ca51a0ce9c2fb4f8 (patch)
tree2a0b0689e8d0f63a41ef0735123f87dff5d55ba4 /src
parent5f243fc68ad0ab9c3bdf484c8f2753ec9414bf37 (diff)
parentac395411cd3f174f3914781f1ce10be15c7b385c (diff)
downloadrneovim-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.c40
-rw-r--r--src/nvim/testdir/test_taglist.vim44
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