From 034d3c8f6c9065d8f219b61521b7b1d3cf7fdf15 Mon Sep 17 00:00:00 2001 From: Riley Bruins Date: Sat, 10 May 2025 10:07:43 -0700 Subject: [PATCH] fix(treesitter): proper tree `contains()` logic with combined injections **Problem:** `LanguageTree:contains()` considers any range within the start of the first tree and end of the last tree as "within" the language tree. In the case of combined injections, this is problematic because we only want to consider ranges within any of the combined trees as "contained" (as opposed to any range within the entire range spanned by all combined trees). **Solution:** Use a more discriminative check in `LanguageTree:contains()`. (cherry picked from commit de45b8e2754f595eb675bd8068b4f9fc7af8d268) --- runtime/lua/vim/treesitter/languagetree.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua index f2e745ec65..bea04ee605 100644 --- a/runtime/lua/vim/treesitter/languagetree.lua +++ b/runtime/lua/vim/treesitter/languagetree.lua @@ -1268,12 +1268,13 @@ end local function tree_contains(tree, range) local tree_ranges = tree:included_ranges(false) - return Range.contains({ - tree_ranges[1][1], - tree_ranges[1][2], - tree_ranges[#tree_ranges][3], - tree_ranges[#tree_ranges][4], - }, range) + for _, tree_range in ipairs(tree_ranges) do + if Range.contains(tree_range, range) then + return true + end + end + + return false end --- Determines whether {range} is contained in the |LanguageTree|.