diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index 068a6028..4385014d 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -1821,21 +1821,36 @@ impl<'a, 'tree> QueryMatch<'a, 'tree> { .iter() .all(|predicate| match predicate { TextPredicate::CaptureEqCapture(i, j, is_positive) => { - let node1 = self.nodes_for_capture_index(*i).next().unwrap(); - let node2 = self.nodes_for_capture_index(*j).next().unwrap(); - let text1 = get_text(buffer1, text_provider.text(node1)); - let text2 = get_text(buffer2, text_provider.text(node2)); - (text1 == text2) == *is_positive + let node1 = self.nodes_for_capture_index(*i).next(); + let node2 = self.nodes_for_capture_index(*j).next(); + match (node1, node2) { + (Some(node1), Some(node2)) => { + let text1 = get_text(buffer1, text_provider.text(node1)); + let text2 = get_text(buffer2, text_provider.text(node2)); + (text1 == text2) == *is_positive + } + _ => true, + } } TextPredicate::CaptureEqString(i, s, is_positive) => { - let node = self.nodes_for_capture_index(*i).next().unwrap(); - let text = get_text(buffer1, text_provider.text(node)); - (text == s.as_bytes()) == *is_positive + let node = self.nodes_for_capture_index(*i).next(); + match node { + Some(node) => { + let text = get_text(buffer1, text_provider.text(node)); + (text == s.as_bytes()) == *is_positive + } + None => true, + } } TextPredicate::CaptureMatchString(i, r, is_positive) => { - let node = self.nodes_for_capture_index(*i).next().unwrap(); - let text = get_text(buffer1, text_provider.text(node)); - r.is_match(text) == *is_positive + let node = self.nodes_for_capture_index(*i).next(); + match node { + Some(node) => { + let text = get_text(buffer1, text_provider.text(node)); + r.is_match(text) == *is_positive + } + None => true, + } } }) } diff --git a/lib/binding_web/binding.js b/lib/binding_web/binding.js index 6296ed35..5352cb18 100644 --- a/lib/binding_web/binding.js +++ b/lib/binding_web/binding.js @@ -785,6 +785,7 @@ class Language { if (c.name === captureName1) node1 = c.node; if (c.name === captureName2) node2 = c.node; } + if(node1 === undefined || node2 === undefined) return true; return (node1.text === node2.text) === isPositive; }); } else { @@ -796,7 +797,7 @@ class Language { return (c.node.text === stringValue) === isPositive; }; } - return false; + return true; }); } break; @@ -819,7 +820,7 @@ class Language { for (const c of captures) { if (c.name === captureName) return regex.test(c.node.text) === isPositive; } - return false; + return true; }); break;