diff --git a/shared/yeast-macros/src/parse.rs b/shared/yeast-macros/src/parse.rs index 6ee23365e04..0889c9a3faf 100644 --- a/shared/yeast-macros/src/parse.rs +++ b/shared/yeast-macros/src/parse.rs @@ -46,7 +46,11 @@ fn parse_query_atom(tokens: &mut Tokens) -> Result { Some(TokenTree::Group(g)) if g.delimiter() == Delimiter::Parenthesis => { let group = expect_group(tokens, Delimiter::Parenthesis)?; let mut inner = group.stream().into_iter().peekable(); - parse_query_node_inner(&mut inner) + let result = parse_query_node_inner(&mut inner)?; + if let Some(tok) = inner.next() { + return Err(syn::Error::new_spanned(tok, "unexpected token in query node")); + } + Ok(result) } Some(tok) => Err(syn::Error::new_spanned( tok.clone(), @@ -348,8 +352,10 @@ fn parse_direct_node_inner(tokens: &mut Tokens, ctx: &Ident) -> Result Result { let fresh = tree_builder::FreshScope::new(); let mut ast = Ast::from_tree(self.language.clone(), tree); - let res = apply_rules(&self.rules, &mut ast, 0, &fresh)?; + let root = ast.get_root(); + let res = apply_rules(&self.rules, &mut ast, root, &fresh)?; if res.len() != 1 { return Err(format!("Expected exactly one result node, got {}", res.len())); } @@ -626,7 +627,8 @@ impl Runner { let tree = parser.parse(input, None) .ok_or_else(|| "Failed to parse input".to_string())?; let mut ast = Ast::from_tree(self.language.clone(), &tree); - let res = apply_rules(&self.rules, &mut ast, 0, &fresh)?; + let root = ast.get_root(); + let res = apply_rules(&self.rules, &mut ast, root, &fresh)?; if res.len() != 1 { return Err(format!("Expected exactly one result node, got {}", res.len())); } diff --git a/shared/yeast/src/query.rs b/shared/yeast/src/query.rs index a5eca37b20b..62aada55ce6 100644 --- a/shared/yeast/src/query.rs +++ b/shared/yeast/src/query.rs @@ -200,7 +200,7 @@ mod tests { let query9: QueryNode = yeast::query!( (assignment left: (element_reference - object*: ((_) @obj)* + object*: ((_) @obj) (_) @index ) right: (_) @rhs