From b324d0802ad977adc180ec10315be7675637d5cd Mon Sep 17 00:00:00 2001 From: Andrew Hlynskyi Date: Tue, 21 Sep 2021 19:23:24 +0300 Subject: [PATCH 1/2] fix(cli): Panic on queries containing alternation with predicates `QuearyMatch::satisfies_text_predicates()` was changed to pass captures that don't relate to a checked predicate. This allows predicates in inner alternations for queries. Refs #1392 --- lib/binding_rust/lib.rs | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index 04dd78bf..f5a85311 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, + } } }) } From 79b2bf1c30c65e8450f3712fcaffa39c6c3301b1 Mon Sep 17 00:00:00 2001 From: Andrew Hlynskyi Date: Tue, 21 Sep 2021 21:13:25 +0300 Subject: [PATCH 2/2] fix(wasm): Fix predicates in alternations, resolves #1392 --- lib/binding_web/binding.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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;