diff options
-rw-r--r-- | runtime/lua/vim/treesitter/languagetree.lua | 8 | ||||
-rw-r--r-- | test/functional/treesitter/highlight_spec.lua | 33 |
2 files changed, 40 insertions, 1 deletions
diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua index ea745c4deb..d8db489d54 100644 --- a/runtime/lua/vim/treesitter/languagetree.lua +++ b/runtime/lua/vim/treesitter/languagetree.lua @@ -318,7 +318,13 @@ function LanguageTree:is_valid(exclude_children, range) end -- TODO: Efficiently search for possibly intersecting regions using a binary search for i, region in pairs(self:included_regions()) do - if not valid_regions[i] and intercepts_region(region, range) then + if + not valid_regions[i] + and ( + intercepts_region(region, range) + or (self._trees[i] and intercepts_region(self._trees[i]:included_ranges(false), range)) + ) + then return false end end diff --git a/test/functional/treesitter/highlight_spec.lua b/test/functional/treesitter/highlight_spec.lua index 7f0a3cb342..02b50fd80e 100644 --- a/test/functional/treesitter/highlight_spec.lua +++ b/test/functional/treesitter/highlight_spec.lua @@ -891,6 +891,39 @@ describe('treesitter highlighting (lua)', function() ]], }) end) + + it('removes outdated highlights', function() + insert('-- int main() {}' .. string.rep("\nprint('test')", 20) .. '\n-- int other() {}') + + exec_lua(function() + vim.cmd.norm('gg') + vim.treesitter.query.set( + 'lua', + 'injections', + [[((comment_content) @injection.content + (#set! injection.combined) + (#set! injection.language "c"))]] + ) + vim.bo.filetype = 'lua' + vim.treesitter.start() + end) + + screen:expect([[ + {18:^-- }{16:int}{18: }{25:main}{16:()}{18: }{16:{}} | + {16:print(}{26:'test'}{16:)} |*16 + | + ]]) + + exec_lua(function() + vim.cmd.norm('gg0dw') + end) + + screen:expect([[ + {25:^int} {25:main}{16:()} {16:{}} | + {16:print(}{26:'test'}{16:)} |*16 + | + ]]) + end) end) describe('treesitter highlighting (help)', function() |