changeset 22312:e06ba60fbbd8 v8.2.1705

patch 8.2.1705: "verbose hi Name" reports incorrect info after ":hi clear" Commit: https://github.com/vim/vim/commit/e8df0104985af58ee501a6fbac8ac9f886e84e5a Author: Bram Moolenaar <Bram@vim.org> Date: Fri Sep 18 19:40:45 2020 +0200 patch 8.2.1705: "verbose hi Name" reports incorrect info after ":hi clear" Problem: "verbose hi Name" reports incorrect info after ":hi clear". Solution: Store the script context. (Antony Scriven, closes https://github.com/vim/vim/issues/6975)
author Bram Moolenaar <Bram@vim.org>
date Fri, 18 Sep 2020 19:45:04 +0200
parents fe6103bf9b0a
children 9b684e0b4c2f
files src/highlight.c src/testdir/test_highlight.vim src/version.c
diffstat 3 files changed, 48 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/highlight.c
+++ b/src/highlight.c
@@ -76,6 +76,7 @@ typedef struct
     int		sg_deflink;	// default link; restored in highlight_clear()
     int		sg_set;		// combination of SG_* flags
 #ifdef FEAT_EVAL
+    sctx_T	sg_deflink_sctx;  // script where the default link was set
     sctx_T	sg_script_ctx;	// script in which the group was last set
 #endif
 } hl_group_T;
@@ -746,7 +747,13 @@ do_highlight(
 	{
 	    hlgroup = &HL_TABLE()[from_id - 1];
 	    if (dodefault && (forceit || hlgroup->sg_deflink == 0))
+	    {
 		hlgroup->sg_deflink = to_id;
+#ifdef FEAT_EVAL
+		hlgroup->sg_deflink_sctx = current_sctx;
+		hlgroup->sg_deflink_sctx.sc_lnum += SOURCING_LNUM;
+#endif
+	    }
 	}
 
 	if (from_id > 0 && (!init || hlgroup->sg_set == 0))
@@ -1691,16 +1698,12 @@ highlight_clear(int idx)
     VIM_CLEAR(HL_TABLE()[idx].sg_font_name);
     HL_TABLE()[idx].sg_gui_attr = 0;
 #endif
-#ifdef FEAT_EVAL
-    // Restore any default link.
+    // Restore default link and context if they exist. Otherwise clears.
     HL_TABLE()[idx].sg_link = HL_TABLE()[idx].sg_deflink;
-    // Clear the script ID only when there is no link, since that is not
-    // cleared.
-    if (HL_TABLE()[idx].sg_link == 0)
-    {
-	HL_TABLE()[idx].sg_script_ctx.sc_sid = 0;
-	HL_TABLE()[idx].sg_script_ctx.sc_lnum = 0;
-    }
+#ifdef FEAT_EVAL
+    // Since we set the default link, set the location to where the default
+    // link was set.
+    HL_TABLE()[idx].sg_script_ctx = HL_TABLE()[idx].sg_deflink_sctx;
 #endif
 }
 
--- a/src/testdir/test_highlight.vim
+++ b/src/testdir/test_highlight.vim
@@ -3,6 +3,7 @@
 source view_util.vim
 source screendump.vim
 source check.vim
+source script_util.vim
 
 func Test_highlight()
   " basic test if ":highlight" doesn't crash
@@ -870,6 +871,39 @@ func Test_highlight_clear_restores_links
   call assert_equal(HighlightArgs('aaa'), hl_aaa_ddd)
 endfunc
 
+func Test_highlight_clear_restores_context()
+  func FuncContextDefault()
+    hi def link Context ContextDefault
+  endfun
+
+  func FuncContextRelink()
+    " Dummy line
+    hi link Context ContextRelink
+  endfunc
+
+  let scriptContextDefault = MakeScript("FuncContextDefault")
+  let scriptContextRelink = MakeScript("FuncContextRelink")
+  let patContextDefault = fnamemodify(scriptContextDefault, ':t') .. ' line 1'
+  let patContextRelink = fnamemodify(scriptContextRelink, ':t') .. ' line 2'
+
+  exec "source" scriptContextDefault
+  let hlContextDefault = execute("verbose hi Context")
+  call assert_match(patContextDefault, hlContextDefault)
+
+  exec "source" scriptContextRelink
+  let hlContextRelink = execute("verbose hi Context")
+  call assert_match(patContextRelink, hlContextRelink)
+
+  hi clear
+  let hlContextAfterClear = execute("verbose hi Context")
+  call assert_match(patContextDefault, hlContextAfterClear)
+
+  delfunc FuncContextDefault
+  delfunc FuncContextRelink
+  call delete(scriptContextDefault)
+  call delete(scriptContextRelink)
+endfunc
+
 func Test_highlight_default_colorscheme_restores_links()
   hi link TestLink Identifier
   hi TestHi ctermbg=red
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1705,
+/**/
     1704,
 /**/
     1703,