]> granicus.if.org Git - vim/commitdiff
patch 8.0.0195: fail to jump to static tag in current file v8.0.0195
authorBram Moolenaar <Bram@vim.org>
Mon, 16 Jan 2017 19:53:34 +0000 (20:53 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 16 Jan 2017 19:53:34 +0000 (20:53 +0100)
Problem:    Jumping to a tag that is a static item in the current file fails.
            (Kazunobu Kuriyama)
Solution:   Make sure the first byte of the tag key is not NUL. (Suggested by
            James McCoy, closes #1387)

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

index 94b5e2b68a1551ce4ba00bce752c50b4991408c5..a80a362df32f6e201e238fb4510678fe9e7acaa8 100644 (file)
--- a/src/tag.c
+++ b/src/tag.c
@@ -44,10 +44,6 @@ typedef struct tag_pointers
 #define MT_GL_CUR      1               /* global match in current file */
 #define MT_GL_OTH      2               /* global match in other file */
 #define MT_ST_OTH      3               /* static match in other file */
-#define MT_IC_ST_CUR   4               /* icase static match in current file */
-#define MT_IC_GL_CUR   5               /* icase global match in current file */
-#define MT_IC_GL_OTH   6               /* icase global match in other file */
-#define MT_IC_ST_OTH   7               /* icase static match in other file */
 #define MT_IC_OFF      4               /* add for icase match */
 #define MT_RE_OFF      8               /* add for regexp match */
 #define MT_MASK                7               /* mask for printing priority */
@@ -2317,7 +2313,7 @@ parse_line:
                        if (tagp.command + 2 < temp_end)
                        {
                            len = (int)(temp_end - tagp.command - 2);
-                           mfp = (char_u *)alloc((int)sizeof(char_u) + len + 1);
+                           mfp = (char_u *)alloc(len + 2);
                            if (mfp != NULL)
                                vim_strncpy(mfp, tagp.command + 2, len);
                        }
@@ -2351,6 +2347,7 @@ parse_line:
                     * Emacs tag: <mtt><tag_fname><0x01><ebuf><0x01><lbuf><NUL>
                     * other tag: <mtt><tag_fname><0x01><0x01><lbuf><NUL>
                     * without Emacs tags: <mtt><tag_fname><0x01><lbuf><NUL>
+                    * Here <mtt> is the "mtt" value plus 1 to avoid NUL.
                     */
                    len = (int)tag_fname_len + (int)STRLEN(lbuf) + 3;
 #ifdef FEAT_EMACS_TAGS
@@ -2366,7 +2363,7 @@ parse_line:
                    if (mfp != NULL)
                    {
                        p = mfp;
-                       p[0] = mtt;
+                       p[0] = mtt + 1;
                        STRCPY(p + 1, tag_fname);
 #ifdef BACKSLASH_IN_FILENAME
                        /* Ignore differences in slashes, avoid adding
@@ -2548,10 +2545,16 @@ findtag_end:
                    vim_free(mfp);
                else
                {
-                   /* now change the TAG_SEP back to NUL */
-                   for (p = mfp; *p != NUL; ++p)
-                       if (*p == TAG_SEP)
-                           *p = NUL;
+                   if (!name_only)
+                   {
+                       /* Change mtt back to zero-based. */
+                       *mfp = *mfp - 1;
+
+                       /* change the TAG_SEP back to NUL */
+                       for (p = mfp + 1; *p != NUL; ++p)
+                           if (*p == TAG_SEP)
+                               *p = NUL;
+                   }
                    matches[match_count++] = (char_u *)mfp;
                }
                todo--;
index 11ec144f63a9181f7f6ad4c7dfed94b358cbc49b..221514db2cbda76c1817a5eaa479faaa31cc40c0 100644 (file)
@@ -23,6 +23,24 @@ func Test_cancel_ptjump()
   quit
 endfunc
 
+func Test_static_tagjump()
+  set tags=Xtags
+  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
+        \ "one\tXfile1\t/^one/;\"\tf\tfile:\tsignature:(void)",
+        \ "word\tXfile2\tcmd2"],
+        \ 'Xtags')
+  new Xfile1
+  call setline(1, ['empty', 'one()', 'empty'])
+  write
+  tag one
+  call assert_equal(2, line('.'))
+
+  set tags&
+  call delete('Xtags')
+  call delete('Xfile1')
+  bwipe!
+endfunc
+
 " Tests for [ CTRL-I and CTRL-W CTRL-I commands
 function Test_keyword_jump()
   call writefile(["#include Xinclude", "",
index cfb4e5969f4a54cb12d84c8a177e803940aa7f6c..28c677696a5c51af14e0d8dd7c94ad95abf6c950 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    195,
 /**/
     194,
 /**/