Fix for-loop expressions breaking with BlockExpr iterable

This commit is contained in:
Lukas Wirth 2021-10-30 16:37:32 +02:00
parent b9fa37f5b4
commit c93983e76f
4 changed files with 44 additions and 5 deletions

View file

@ -81,10 +81,17 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> String {
.map(|node| {
let name = format_ident!("{}", node.name);
let kind = format_ident!("{}", to_upper_snake_case(&node.name));
let traits = node.traits.iter().map(|trait_name| {
let trait_name = format_ident!("{}", trait_name);
quote!(impl ast::#trait_name for #name {})
});
let traits = node
.traits
.iter()
.filter(|trait_name| {
// For loops have two expressions so this might collide, therefor manual impl it
node.name != "ForExpr" || trait_name.as_str() != "HasLoopBody"
})
.map(|trait_name| {
let trait_name = format_ident!("{}", trait_name);
quote!(impl ast::#trait_name for #name {})
});
let methods = node.fields.iter().map(|field| {
let method_name = field.method_name();