Merge pull request #1394 from tree-sitter/fix/query-predicates-with-alternations

fix(cli): Panic on queries containing alternation with predicates
This commit is contained in:
Max Brunsfeld 2021-09-24 08:56:23 -07:00 committed by GitHub
commit 561dfe3a2d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 13 deletions

View file

@ -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,
}
}
})
}

View file

@ -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;