mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	test: starting and stopping treesitter highlight (#29546)
(cherry picked from commit 599fc7cee4)
			
			
This commit is contained in:
		
				
					committed by
					
						
						github-actions[bot]
					
				
			
			
				
	
			
			
			
						parent
						
							2845d05569
						
					
				
				
					commit
					65776124b1
				
			@@ -8,6 +8,7 @@ local exec_lua = n.exec_lua
 | 
				
			|||||||
local feed = n.feed
 | 
					local feed = n.feed
 | 
				
			||||||
local command = n.command
 | 
					local command = n.command
 | 
				
			||||||
local api = n.api
 | 
					local api = n.api
 | 
				
			||||||
 | 
					local fn = n.fn
 | 
				
			||||||
local eq = t.eq
 | 
					local eq = t.eq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local hl_query_c = [[
 | 
					local hl_query_c = [[
 | 
				
			||||||
@@ -63,6 +64,46 @@ static int nlua_schedule(lua_State *const lstate)
 | 
				
			|||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}]]
 | 
					}]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local hl_grid_legacy_c = [[
 | 
				
			||||||
 | 
					  {2:^/// Schedule Lua callback on main loop's event queue}             |
 | 
				
			||||||
 | 
					  {3:static} {3:int} nlua_schedule(lua_State *{3:const} lstate)                |
 | 
				
			||||||
 | 
					  {                                                                |
 | 
				
			||||||
 | 
					    {4:if} (lua_type(lstate, {5:1}) != LUA_TFUNCTION                       |
 | 
				
			||||||
 | 
					        || lstate != lstate) {                                     |
 | 
				
			||||||
 | 
					      lua_pushliteral(lstate, {5:"vim.schedule: expected function"});  |
 | 
				
			||||||
 | 
					      {4:return} lua_error(lstate);                                    |
 | 
				
			||||||
 | 
					    }                                                              |
 | 
				
			||||||
 | 
					                                                                   |
 | 
				
			||||||
 | 
					    LuaRef cb = nlua_ref(lstate, {5:1});                               |
 | 
				
			||||||
 | 
					                                                                   |
 | 
				
			||||||
 | 
					    multiqueue_put(main_loop.events, nlua_schedule_event,          |
 | 
				
			||||||
 | 
					                   {5:1}, ({3:void} *)({3:ptrdiff_t})cb);                      |
 | 
				
			||||||
 | 
					    {4:return} {5:0};                                                      |
 | 
				
			||||||
 | 
					  }                                                                |
 | 
				
			||||||
 | 
					  {1:~                                                                }|*2
 | 
				
			||||||
 | 
					                                                                   |
 | 
				
			||||||
 | 
					]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local hl_grid_ts_c = [[
 | 
				
			||||||
 | 
					  {2:^/// Schedule Lua callback on main loop's event queue}             |
 | 
				
			||||||
 | 
					  {3:static} {3:int} {11:nlua_schedule}({3:lua_State} *{3:const} lstate)                |
 | 
				
			||||||
 | 
					  {                                                                |
 | 
				
			||||||
 | 
					    {4:if} ({11:lua_type}(lstate, {5:1}) != {5:LUA_TFUNCTION}                       |
 | 
				
			||||||
 | 
					        || {6:lstate} != {6:lstate}) {                                     |
 | 
				
			||||||
 | 
					      {11:lua_pushliteral}(lstate, {5:"vim.schedule: expected function"});  |
 | 
				
			||||||
 | 
					      {4:return} {11:lua_error}(lstate);                                    |
 | 
				
			||||||
 | 
					    }                                                              |
 | 
				
			||||||
 | 
					                                                                   |
 | 
				
			||||||
 | 
					    {7:LuaRef} cb = {11:nlua_ref}(lstate, {5:1});                               |
 | 
				
			||||||
 | 
					                                                                   |
 | 
				
			||||||
 | 
					    multiqueue_put(main_loop.events, {11:nlua_schedule_event},          |
 | 
				
			||||||
 | 
					                   {5:1}, ({3:void} *)({3:ptrdiff_t})cb);                      |
 | 
				
			||||||
 | 
					    {4:return} {5:0};                                                      |
 | 
				
			||||||
 | 
					  }                                                                |
 | 
				
			||||||
 | 
					  {1:~                                                                }|*2
 | 
				
			||||||
 | 
					                                                                   |
 | 
				
			||||||
 | 
					]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local test_text_c = [[
 | 
					local test_text_c = [[
 | 
				
			||||||
void ui_refresh(void)
 | 
					void ui_refresh(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -140,11 +181,39 @@ describe('treesitter highlighting (C)', function()
 | 
				
			|||||||
    command [[ hi link @warning WarningMsg ]]
 | 
					    command [[ hi link @warning WarningMsg ]]
 | 
				
			||||||
  end)
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('starting and stopping treesitter highlight works', function()
 | 
				
			||||||
 | 
					    command('setfiletype c | syntax on')
 | 
				
			||||||
 | 
					    fn.setreg('r', hl_text_c)
 | 
				
			||||||
 | 
					    feed('i<C-R><C-O>r<Esc>gg')
 | 
				
			||||||
 | 
					    -- legacy syntax highlighting is used by default
 | 
				
			||||||
 | 
					    screen:expect(hl_grid_legacy_c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exec_lua([[
 | 
				
			||||||
 | 
					      vim.treesitter.query.set('c', 'highlights', hl_query)
 | 
				
			||||||
 | 
					      vim.treesitter.start()
 | 
				
			||||||
 | 
					    ]])
 | 
				
			||||||
 | 
					    -- treesitter highlighting is used
 | 
				
			||||||
 | 
					    screen:expect(hl_grid_ts_c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exec_lua('vim.treesitter.stop()')
 | 
				
			||||||
 | 
					    -- legacy syntax highlighting is used
 | 
				
			||||||
 | 
					    screen:expect(hl_grid_legacy_c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exec_lua('vim.treesitter.start()')
 | 
				
			||||||
 | 
					    -- treesitter highlighting is used
 | 
				
			||||||
 | 
					    screen:expect(hl_grid_ts_c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exec_lua('vim.treesitter.stop()')
 | 
				
			||||||
 | 
					    -- legacy syntax highlighting is used
 | 
				
			||||||
 | 
					    screen:expect(hl_grid_legacy_c)
 | 
				
			||||||
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it('is updated with edits', function()
 | 
					  it('is updated with edits', function()
 | 
				
			||||||
    insert(hl_text_c)
 | 
					    insert(hl_text_c)
 | 
				
			||||||
 | 
					    feed('gg')
 | 
				
			||||||
    screen:expect {
 | 
					    screen:expect {
 | 
				
			||||||
      grid = [[
 | 
					      grid = [[
 | 
				
			||||||
      /// Schedule Lua callback on main loop's event queue             |
 | 
					      ^/// Schedule Lua callback on main loop's event queue             |
 | 
				
			||||||
      static int nlua_schedule(lua_State *const lstate)                |
 | 
					      static int nlua_schedule(lua_State *const lstate)                |
 | 
				
			||||||
      {                                                                |
 | 
					      {                                                                |
 | 
				
			||||||
        if (lua_type(lstate, 1) != LUA_TFUNCTION                       |
 | 
					        if (lua_type(lstate, 1) != LUA_TFUNCTION                       |
 | 
				
			||||||
@@ -158,7 +227,7 @@ describe('treesitter highlighting (C)', function()
 | 
				
			|||||||
        multiqueue_put(main_loop.events, nlua_schedule_event,          |
 | 
					        multiqueue_put(main_loop.events, nlua_schedule_event,          |
 | 
				
			||||||
                       1, (void *)(ptrdiff_t)cb);                      |
 | 
					                       1, (void *)(ptrdiff_t)cb);                      |
 | 
				
			||||||
        return 0;                                                      |
 | 
					        return 0;                                                      |
 | 
				
			||||||
      ^}                                                                |
 | 
					      }                                                                |
 | 
				
			||||||
      {1:~                                                                }|*2
 | 
					      {1:~                                                                }|*2
 | 
				
			||||||
                                                                       |
 | 
					                                                                       |
 | 
				
			||||||
    ]],
 | 
					    ]],
 | 
				
			||||||
@@ -169,27 +238,7 @@ describe('treesitter highlighting (C)', function()
 | 
				
			|||||||
      local highlighter = vim.treesitter.highlighter
 | 
					      local highlighter = vim.treesitter.highlighter
 | 
				
			||||||
      test_hl = highlighter.new(parser, {queries = {c = hl_query}})
 | 
					      test_hl = highlighter.new(parser, {queries = {c = hl_query}})
 | 
				
			||||||
    ]]
 | 
					    ]]
 | 
				
			||||||
    screen:expect {
 | 
					    screen:expect(hl_grid_ts_c)
 | 
				
			||||||
      grid = [[
 | 
					 | 
				
			||||||
      {2:/// Schedule Lua callback on main loop's event queue}             |
 | 
					 | 
				
			||||||
      {3:static} {3:int} {11:nlua_schedule}({3:lua_State} *{3:const} lstate)                |
 | 
					 | 
				
			||||||
      {                                                                |
 | 
					 | 
				
			||||||
        {4:if} ({11:lua_type}(lstate, {5:1}) != {5:LUA_TFUNCTION}                       |
 | 
					 | 
				
			||||||
            || {6:lstate} != {6:lstate}) {                                     |
 | 
					 | 
				
			||||||
          {11:lua_pushliteral}(lstate, {5:"vim.schedule: expected function"});  |
 | 
					 | 
				
			||||||
          {4:return} {11:lua_error}(lstate);                                    |
 | 
					 | 
				
			||||||
        }                                                              |
 | 
					 | 
				
			||||||
                                                                       |
 | 
					 | 
				
			||||||
        {7:LuaRef} cb = {11:nlua_ref}(lstate, {5:1});                               |
 | 
					 | 
				
			||||||
                                                                       |
 | 
					 | 
				
			||||||
        multiqueue_put(main_loop.events, {11:nlua_schedule_event},          |
 | 
					 | 
				
			||||||
                       {5:1}, ({3:void} *)({3:ptrdiff_t})cb);                      |
 | 
					 | 
				
			||||||
        {4:return} {5:0};                                                      |
 | 
					 | 
				
			||||||
      ^}                                                                |
 | 
					 | 
				
			||||||
      {1:~                                                                }|*2
 | 
					 | 
				
			||||||
                                                                       |
 | 
					 | 
				
			||||||
    ]],
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    feed('5Goc<esc>dd')
 | 
					    feed('5Goc<esc>dd')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -525,40 +574,21 @@ describe('treesitter highlighting (C)', function()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  it('supports highlighting with custom highlight groups', function()
 | 
					  it('supports highlighting with custom highlight groups', function()
 | 
				
			||||||
    insert(hl_text_c)
 | 
					    insert(hl_text_c)
 | 
				
			||||||
 | 
					    feed('gg')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    exec_lua [[
 | 
					    exec_lua [[
 | 
				
			||||||
      local parser = vim.treesitter.get_parser(0, "c")
 | 
					      local parser = vim.treesitter.get_parser(0, "c")
 | 
				
			||||||
      test_hl = vim.treesitter.highlighter.new(parser, {queries = {c = hl_query}})
 | 
					      test_hl = vim.treesitter.highlighter.new(parser, {queries = {c = hl_query}})
 | 
				
			||||||
    ]]
 | 
					    ]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    screen:expect {
 | 
					    screen:expect(hl_grid_ts_c)
 | 
				
			||||||
      grid = [[
 | 
					 | 
				
			||||||
      {2:/// Schedule Lua callback on main loop's event queue}             |
 | 
					 | 
				
			||||||
      {3:static} {3:int} {11:nlua_schedule}({3:lua_State} *{3:const} lstate)                |
 | 
					 | 
				
			||||||
      {                                                                |
 | 
					 | 
				
			||||||
        {4:if} ({11:lua_type}(lstate, {5:1}) != {5:LUA_TFUNCTION}                       |
 | 
					 | 
				
			||||||
            || {6:lstate} != {6:lstate}) {                                     |
 | 
					 | 
				
			||||||
          {11:lua_pushliteral}(lstate, {5:"vim.schedule: expected function"});  |
 | 
					 | 
				
			||||||
          {4:return} {11:lua_error}(lstate);                                    |
 | 
					 | 
				
			||||||
        }                                                              |
 | 
					 | 
				
			||||||
                                                                       |
 | 
					 | 
				
			||||||
        {7:LuaRef} cb = {11:nlua_ref}(lstate, {5:1});                               |
 | 
					 | 
				
			||||||
                                                                       |
 | 
					 | 
				
			||||||
        multiqueue_put(main_loop.events, {11:nlua_schedule_event},          |
 | 
					 | 
				
			||||||
                       {5:1}, ({3:void} *)({3:ptrdiff_t})cb);                      |
 | 
					 | 
				
			||||||
        {4:return} {5:0};                                                      |
 | 
					 | 
				
			||||||
      ^}                                                                |
 | 
					 | 
				
			||||||
      {1:~                                                                }|*2
 | 
					 | 
				
			||||||
                                                                       |
 | 
					 | 
				
			||||||
    ]],
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    -- This will change ONLY the literal strings to look like comments
 | 
					    -- This will change ONLY the literal strings to look like comments
 | 
				
			||||||
    -- The only literal string is the "vim.schedule: expected function" in this test.
 | 
					    -- The only literal string is the "vim.schedule: expected function" in this test.
 | 
				
			||||||
    exec_lua [[vim.cmd("highlight link @string.nonexistent_specializer comment")]]
 | 
					    exec_lua [[vim.cmd("highlight link @string.nonexistent_specializer comment")]]
 | 
				
			||||||
    screen:expect {
 | 
					    screen:expect {
 | 
				
			||||||
      grid = [[
 | 
					      grid = [[
 | 
				
			||||||
      {2:/// Schedule Lua callback on main loop's event queue}             |
 | 
					      {2:^/// Schedule Lua callback on main loop's event queue}             |
 | 
				
			||||||
      {3:static} {3:int} {11:nlua_schedule}({3:lua_State} *{3:const} lstate)                |
 | 
					      {3:static} {3:int} {11:nlua_schedule}({3:lua_State} *{3:const} lstate)                |
 | 
				
			||||||
      {                                                                |
 | 
					      {                                                                |
 | 
				
			||||||
        {4:if} ({11:lua_type}(lstate, {5:1}) != {5:LUA_TFUNCTION}                       |
 | 
					        {4:if} ({11:lua_type}(lstate, {5:1}) != {5:LUA_TFUNCTION}                       |
 | 
				
			||||||
@@ -572,7 +602,7 @@ describe('treesitter highlighting (C)', function()
 | 
				
			|||||||
        multiqueue_put(main_loop.events, {11:nlua_schedule_event},          |
 | 
					        multiqueue_put(main_loop.events, {11:nlua_schedule_event},          |
 | 
				
			||||||
                       {5:1}, ({3:void} *)({3:ptrdiff_t})cb);                      |
 | 
					                       {5:1}, ({3:void} *)({3:ptrdiff_t})cb);                      |
 | 
				
			||||||
        {4:return} {5:0};                                                      |
 | 
					        {4:return} {5:0};                                                      |
 | 
				
			||||||
      ^}                                                                |
 | 
					      }                                                                |
 | 
				
			||||||
      {1:~                                                                }|*2
 | 
					      {1:~                                                                }|*2
 | 
				
			||||||
                                                                       |
 | 
					                                                                       |
 | 
				
			||||||
    ]],
 | 
					    ]],
 | 
				
			||||||
@@ -1071,4 +1101,25 @@ it('starting and stopping treesitter highlight in init.lua works #29541', functi
 | 
				
			|||||||
  end)
 | 
					  end)
 | 
				
			||||||
  clear({ args = { '-u', 'Xinit.lua' } })
 | 
					  clear({ args = { '-u', 'Xinit.lua' } })
 | 
				
			||||||
  eq('', api.nvim_get_vvar('errmsg'))
 | 
					  eq('', api.nvim_get_vvar('errmsg'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local screen = Screen.new(65, 18)
 | 
				
			||||||
 | 
					  screen:attach()
 | 
				
			||||||
 | 
					  screen:set_default_attr_ids {
 | 
				
			||||||
 | 
					    [1] = { bold = true, foreground = Screen.colors.Blue1 },
 | 
				
			||||||
 | 
					    [2] = { foreground = Screen.colors.Blue1 },
 | 
				
			||||||
 | 
					    [3] = { bold = true, foreground = Screen.colors.SeaGreen4 },
 | 
				
			||||||
 | 
					    [4] = { bold = true, foreground = Screen.colors.Brown },
 | 
				
			||||||
 | 
					    [5] = { foreground = Screen.colors.Magenta },
 | 
				
			||||||
 | 
					    [6] = { foreground = Screen.colors.Red },
 | 
				
			||||||
 | 
					    [7] = { bold = true, foreground = Screen.colors.SlateBlue },
 | 
				
			||||||
 | 
					    [8] = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
 | 
				
			||||||
 | 
					    [9] = { foreground = Screen.colors.Magenta, background = Screen.colors.Red },
 | 
				
			||||||
 | 
					    [10] = { foreground = Screen.colors.Red, background = Screen.colors.Red },
 | 
				
			||||||
 | 
					    [11] = { foreground = Screen.colors.Cyan4 },
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fn.setreg('r', hl_text_c)
 | 
				
			||||||
 | 
					  feed('i<C-R><C-O>r<Esc>gg')
 | 
				
			||||||
 | 
					  -- legacy syntax highlighting is used
 | 
				
			||||||
 | 
					  screen:expect(hl_grid_legacy_c)
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user