]> granicus.if.org Git - vim/commitdiff
patch 8.2.0365: tag kind can't be a multi-byte character v8.2.0365
authorBram Moolenaar <Bram@vim.org>
Mon, 9 Mar 2020 07:17:52 +0000 (08:17 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 9 Mar 2020 07:17:52 +0000 (08:17 +0100)
Problem:    Tag kind can't be a multi-byte character. (Marcin Szamotulski)
Solution:   Recognize multi-byte character. (closes #5724)

src/tag.c
src/testdir/test_taglist.vim
src/version.c

index ee3b4cce5314ea90a1fb14e2a752aaa5a0173886..bf45b2100cbf5c4af4949eec9a354608088fd88c 100644 (file)
--- a/src/tag.c
+++ b/src/tag.c
@@ -3229,7 +3229,9 @@ parse_match(
                tagp->command_end = p;
            p += 2;     // skip ";\""
            if (*p++ == TAB)
-               while (ASCII_ISALPHA(*p))
+               // Accept ASCII alphabetic kind characters and any multi-byte
+               // character.
+               while (ASCII_ISALPHA(*p) || mb_ptr2len(p) > 1)
                {
                    if (STRNCMP(p, "kind:", 5) == 0)
                        tagp->tagkind = p + 5;
@@ -3245,20 +3247,21 @@ parse_match(
                        tagp->tagkind = p;
                    if (pt == NULL)
                        break;
-                   p = pt + 1;
+                   p = pt;
+                   MB_PTR_ADV(p);
                }
        }
        if (tagp->tagkind != NULL)
        {
            for (p = tagp->tagkind;
-                           *p && *p != '\t' && *p != '\r' && *p != '\n'; ++p)
+                           *p && *p != '\t' && *p != '\r' && *p != '\n'; MB_PTR_ADV(p))
                ;
            tagp->tagkind_end = p;
        }
        if (tagp->user_data != NULL)
        {
            for (p = tagp->user_data;
-                           *p && *p != '\t' && *p != '\r' && *p != '\n'; ++p)
+                           *p && *p != '\t' && *p != '\r' && *p != '\n'; MB_PTR_ADV(p))
                ;
            tagp->user_data_end = p;
        }
@@ -4006,7 +4009,7 @@ get_tags(list_T *list, char_u *pat, char_u *buf_fname)
            if (tp.command_end != NULL)
            {
                for (p = tp.command_end + 3;
-                                  *p != NUL && *p != '\n' && *p != '\r'; ++p)
+                         *p != NUL && *p != '\n' && *p != '\r'; MB_PTR_ADV(p))
                {
                    if (p == tp.tagkind || (p + 5 == tp.tagkind
                                              && STRNCMP(p, "kind:", 5) == 0))
index 0f2615d52066752070e306fa02348fd776c99003..1d662c08d70311e6b8967310f737b992caac1251 100644 (file)
@@ -7,6 +7,7 @@ func Test_taglist()
        \ "BFoo\tXbar\t1",
        \ "BBar\tXbar\t2",
        \ "Kindly\tXbar\t3;\"\tv\tfile:",
+       \ "Lambda\tXbar\t3;\"\tλ\tfile:",
        \ "Command\tXbar\tcall cursor(3, 4)|;\"\td",
        \ ], 'Xtags')
   set tags=Xtags
@@ -17,12 +18,16 @@ 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 kindly = taglist("Kindly")
+  call assert_equal(1, len(kindly))
+  call assert_equal('v', kindly[0]['kind'])
+  call assert_equal('3', kindly[0]['cmd'])
+  call assert_equal(1, kindly[0]['static'])
+  call assert_equal('Xbar', kindly[0]['filename'])
+
+  let lambda = taglist("Lambda")
+  call assert_equal(1, len(lambda))
+  call assert_equal('λ', lambda[0]['kind'])
 
   let cmd = taglist("Command")
   call assert_equal(1, len(cmd))
index d88f5ec1157133801d144c817b549f9d01a5a9a7..8e93d5d5ce44e72c937b70644d5bdaa841b56021 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    365,
 /**/
     364,
 /**/