Fix ast_node gen errors.

This commit is contained in:
Jesse Brault 2025-09-29 09:49:02 -05:00
parent c32ae72beb
commit 058b33ece5
4 changed files with 32 additions and 29 deletions

View File

@ -67,7 +67,7 @@ pub fn make_ast_enum_member(build_spec: &BuildSpec) -> Option<TokenStream> {
} }
.map(|type_ident| { .map(|type_ident| {
quote! { quote! {
#type_ident(#type_ident) #type_ident(&'a #type_ident)
} }
}) })
} }

View File

@ -11,7 +11,7 @@ pub fn make_polymorphic_type_ast_node_impl(spec: &PolymorphicTypeBuildSpec) -> T
let variant_ident = format_ident!("{}", variant.name()); let variant_ident = format_ident!("{}", variant.name());
let child_ident = format_ident!("{}", variant.inner_kind().to_case(Case::Snake)); let child_ident = format_ident!("{}", variant.inner_kind().to_case(Case::Snake));
quote! { quote! {
#type_ident::#variant_ident(#child_ident) => vec![#child_ident] #type_ident::#variant_ident(#child_ident) => vec![#child_ident.as_node_ref()]
} }
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();

View File

@ -8,41 +8,44 @@ pub fn make_struct_ast_node_impl(spec: &StructSpec) -> TokenStream {
.children() .children()
.map(|child| match child { .map(|child| match child {
StructChild::SkipChild(_) => None, StructChild::SkipChild(_) => None,
StructChild::VecChild(vec_child) => { StructChild::VecChild(vec_child) => match vec_child.build() {
match vec_child.build() { VecChildBuild::String(_) => None,
VecChildBuild::String(_) => None, VecChildBuild::Node(_) => {
VecChildBuild::Node(_) => { let child_ident = format_ident!("{}", vec_child.name());
let child_ident = format_ident!("{}", vec_child.name()); let children_stream = quote! {
let children_stream = quote! { for child in self.#child_ident().map(AstNode::as_node_ref) {
for child in self.#child_ident().map(AstNode::as_node_ref).collect() { children.push(child);
children.push(child); }
};
Some(children_stream)
}
},
StructChild::MemberChild(member_child) => match member_child.build() {
MemberChildBuild::Node(node_child) => {
let child_ident = format_ident!("{}", member_child.name());
if member_child.optional() {
Some(quote! {
if let Some(#child_ident) = self.#child_ident() {
children.push(#child_ident.as_node_ref());
} }
}; })
Some(children_stream) } else {
Some(quote! {
children.push(self.#child_ident().as_node_ref())
})
} }
} }
} MemberChildBuild::Boolean(_) => None,
StructChild::MemberChild(member_child) => { },
match member_child.build() {
MemberChildBuild::Node(_) => {
let child_ident = format_ident!("{}", member_child.name());
let child_stream = quote! {
children.add(self.#child_ident().as_node_ref())
};
Some(child_stream)
}
MemberChildBuild::Boolean(_) => None
}
}
}) })
.filter(Option::is_some) .filter(Option::is_some)
.map(Option::unwrap) .map(Option::unwrap)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
quote! { quote! {
impl AstNode for #type_ident { impl AstNode for #type_ident {
fn children(&self) -> Vec<AstNodeRef> { fn children(&self) -> Vec<AstNodeRef> {
let children: Vec<AstNodeRef> = vec![]; let mut children: Vec<AstNodeRef> = vec![];
#(#child_adders;)* #(#child_adders;)*
children children
} }

View File

@ -11,11 +11,11 @@ use crate::build_fn::make_build_fn;
use crate::deserialize::deserialize_yaml_spec; use crate::deserialize::deserialize_yaml_spec;
use crate::pretty_print::make_pretty_print_impl; use crate::pretty_print::make_pretty_print_impl;
use crate::type_gen::make_type; use crate::type_gen::make_type;
use crate::walk::make_walk_fn;
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::quote; use quote::quote;
use spec::BuildSpec; use spec::BuildSpec;
use syn::File; use syn::File;
use crate::walk::make_walk_fn;
fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) { fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) {
println!("*** BuildSpec ***"); println!("*** BuildSpec ***");
@ -168,7 +168,7 @@ fn generate_ast_node_file(build_specs: &[BuildSpec]) -> AstGeneratedFile {
let combined = quote! { let combined = quote! {
use crate::ast::node::*; use crate::ast::node::*;
pub enum AstNodeRef { pub enum AstNodeRef<'a> {
#(#ast_enum_members,)* #(#ast_enum_members,)*
} }