Allow queries to match on supertypes

Co-authored-by: Ayman Nadeem <aymannadeem@github.com>
This commit is contained in:
Max Brunsfeld 2020-09-21 12:34:48 -07:00
parent f10a8448ed
commit b5a9adb555
8 changed files with 155 additions and 20 deletions

View file

@ -68,6 +68,7 @@ impl<'a> Minimizer<'a> {
..
} => {
if !self.simple_aliases.contains_key(&symbol)
&& !self.syntax_grammar.supertype_symbols.contains(&symbol)
&& !aliased_symbols.contains(&symbol)
&& self.syntax_grammar.variables[symbol.index].kind
!= VariableType::Named

View file

@ -460,6 +460,9 @@ impl Generator {
VariableType::Hidden => {
add_line!(self, ".visible = false,");
add_line!(self, ".named = true,");
if self.syntax_grammar.supertype_symbols.contains(symbol) {
add_line!(self, ".supertype = true,");
}
}
VariableType::Auxiliary => {
add_line!(self, ".visible = false,");

View file

@ -701,7 +701,6 @@ fn test_query_matches_with_immediate_siblings() {
(2, vec![("last-stmt", "g()")]),
],
);
});
}
@ -1395,6 +1394,45 @@ fn test_query_matches_with_anonymous_tokens() {
});
}
#[test]
fn test_query_matches_with_supertypes() {
allocations::record(|| {
let language = get_language("python");
let query = Query::new(
language,
r#"
((_simple_statement) @before . (_simple_statement) @after)
(assignment
left: (left_hand_side (identifier) @def))
(_primary_expression/identifier) @ref
"#,
)
.unwrap();
assert_query_matches(
language,
&query,
"
a = b
print c
if d: print e.f; print g.h.i
",
&[
(1, vec![("def", "a")]),
(2, vec![("ref", "b")]),
(0, vec![("before", "a = b"), ("after", "print c")]),
(2, vec![("ref", "c")]),
(2, vec![("ref", "d")]),
(2, vec![("ref", "e")]),
(0, vec![("before", "print e.f"), ("after", "print g.h.i")]),
(2, vec![("ref", "g")]),
],
);
});
}
#[test]
fn test_query_matches_within_byte_range() {
allocations::record(|| {