Fix missing box.

This commit is contained in:
Jesse Brault 2025-09-24 14:18:49 -05:00
parent 8a6e4277a7
commit 12c565d0e1

View File

@ -1,4 +1,6 @@
use crate::spec::struct_spec::{MemberChild, MemberChildBuild, StructChild, StructSpec, VecChild, VecChildBuild}; use crate::spec::struct_spec::{
MemberChild, MemberChildBuild, StructChild, StructSpec, VecChild, VecChildBuild,
};
use proc_macro2::{Ident, TokenStream}; use proc_macro2::{Ident, TokenStream};
use quote::{format_ident, quote}; use quote::{format_ident, quote};
@ -11,16 +13,16 @@ fn make_vec_child_accessors(vec_child: &VecChild) -> TokenStream {
self.#child_ident.iter().map(String::as_str) self.#child_ident.iter().map(String::as_str)
} }
} }
}, }
VecChildBuild::Node(vec_child_node_build) => { VecChildBuild::Node(vec_child_node_build) => {
let child_type_ident = format_ident!("{}", vec_child_node_build.kind()); let child_type_ident = format_ident!("{}", vec_child_node_build.kind());
let child_ident_mut = format_ident!("{}_mut", vec_child.name()); let child_ident_mut = format_ident!("{}_mut", vec_child.name());
quote! { quote! {
pub fn #child_ident(&self) -> impl Iterator<Item = &#child_type_ident> { pub fn #child_ident(&self) -> impl Iterator<Item = &#child_type_ident> {
self.#child_ident.iter().map(Box::as_ref) self.#child_ident.iter().map(Box::as_ref)
} }
pub fn #child_ident_mut(&mut self) -> impl Iterator<Item = &mut child_type_ident> { pub fn #child_ident_mut(&mut self) -> impl Iterator<Item = &mut child_type_ident> {
self.#child_ident.iter().map(Box::as_mut) self.#child_ident.iter().map(Box::as_mut)
} }
@ -35,7 +37,7 @@ fn make_member_child_accessors(member_child: &MemberChild) -> TokenStream {
MemberChildBuild::Node(node_member_build) => { MemberChildBuild::Node(node_member_build) => {
let return_type_ident = format_ident!("{}", node_member_build.kind()); let return_type_ident = format_ident!("{}", node_member_build.kind());
let child_ident_mut = format_ident!("{}_mut", member_child.name()); let child_ident_mut = format_ident!("{}_mut", member_child.name());
if member_child.optional() { if member_child.optional() {
quote! { quote! {
pub fn #child_ident(&self) -> Option<&#return_type_ident> { pub fn #child_ident(&self) -> Option<&#return_type_ident> {
@ -45,7 +47,7 @@ fn make_member_child_accessors(member_child: &MemberChild) -> TokenStream {
None None
} }
} }
pub fn #child_ident_mut(&mut self) -> Option<&mut #return_type_ident> { pub fn #child_ident_mut(&mut self) -> Option<&mut #return_type_ident> {
if let Some(#child_ident) = &mut self.#child_ident { if let Some(#child_ident) = &mut self.#child_ident {
Some(#child_ident.as_mut()) Some(#child_ident.as_mut())
@ -59,7 +61,7 @@ fn make_member_child_accessors(member_child: &MemberChild) -> TokenStream {
pub fn #child_ident(&self) -> &#return_type_ident { pub fn #child_ident(&self) -> &#return_type_ident {
self.#child_ident.as_ref() self.#child_ident.as_ref()
} }
pub fn #child_ident_mut(&mut self) -> &mut #return_type_ident { pub fn #child_ident_mut(&mut self) -> &mut #return_type_ident {
self.#child_ident.as_mut() self.#child_ident.as_mut()
} }
@ -79,24 +81,16 @@ fn make_member_child_accessors(member_child: &MemberChild) -> TokenStream {
fn make_accessors(child: &StructChild) -> Option<TokenStream> { fn make_accessors(child: &StructChild) -> Option<TokenStream> {
match child { match child {
StructChild::SkipChild(_) => None, StructChild::SkipChild(_) => None,
StructChild::VecChild(vec_child) => { StructChild::VecChild(vec_child) => Some(make_vec_child_accessors(vec_child)),
Some(make_vec_child_accessors(vec_child)) StructChild::MemberChild(member_child) => Some(make_member_child_accessors(member_child)),
}
StructChild::MemberChild(member_child) => {
Some(make_member_child_accessors(member_child))
}
} }
} }
fn make_member_ident(child: &StructChild) -> Option<Ident> { fn make_member_ident(child: &StructChild) -> Option<Ident> {
match child { match child {
StructChild::SkipChild(_) => None, StructChild::SkipChild(_) => None,
StructChild::VecChild(vec_child) => { StructChild::VecChild(vec_child) => Some(format_ident!("{}", vec_child.name())),
Some(format_ident!("{}", vec_child.name())) StructChild::MemberChild(member_child) => Some(format_ident!("{}", member_child.name())),
},
StructChild::MemberChild(member_child) => {
Some(format_ident!("{}", member_child.name()))
}
} }
} }
@ -107,9 +101,9 @@ fn make_vec_child_annotated_member(vec_child: &VecChild) -> TokenStream {
VecChildBuild::Node(vec_child_node_build) => { VecChildBuild::Node(vec_child_node_build) => {
let type_ident = format_ident!("{}", vec_child_node_build.kind()); let type_ident = format_ident!("{}", vec_child_node_build.kind());
quote! { Box<#type_ident> } quote! { Box<#type_ident> }
}, }
}; };
quote! { quote! {
#child_ident: Vec<#type_stream> #child_ident: Vec<#type_stream>
} }
@ -120,7 +114,7 @@ fn make_member_child_type_ident(member_child: &MemberChild) -> TokenStream {
MemberChildBuild::Node(node_member_build) => { MemberChildBuild::Node(node_member_build) => {
let type_ident = format_ident!("{}", node_member_build.kind()); let type_ident = format_ident!("{}", node_member_build.kind());
quote! { #type_ident } quote! { #type_ident }
}, }
MemberChildBuild::Boolean(_) => { MemberChildBuild::Boolean(_) => {
quote! { bool } quote! { bool }
} }
@ -131,11 +125,11 @@ fn make_member_child_annotated_member(member_child: &MemberChild) -> TokenStream
let child_name_ident = format_ident!("{}", member_child.name()); let child_name_ident = format_ident!("{}", member_child.name());
let type_ident = make_member_child_type_ident(member_child); let type_ident = make_member_child_type_ident(member_child);
let type_stream = if member_child.optional() { let type_stream = if member_child.optional() {
quote! { Option<#type_ident> } quote! { Option<Box<#type_ident>> }
} else { } else {
type_ident quote! { Box<#type_ident> }
}; };
quote! { quote! {
#child_name_ident: #type_stream #child_name_ident: #type_stream
} }
@ -145,36 +139,35 @@ fn make_annotated_member(child: &StructChild) -> Option<TokenStream> {
match child { match child {
StructChild::SkipChild(_) => None, StructChild::SkipChild(_) => None,
StructChild::VecChild(vec_child) => Some(make_vec_child_annotated_member(vec_child)), StructChild::VecChild(vec_child) => Some(make_vec_child_annotated_member(vec_child)),
StructChild::MemberChild(member_child) => Some(make_member_child_annotated_member(member_child)), StructChild::MemberChild(member_child) => {
Some(make_member_child_annotated_member(member_child))
}
} }
} }
pub fn make_struct_type(build_spec: &StructSpec) -> TokenStream { pub fn make_struct_type(build_spec: &StructSpec) -> TokenStream {
let type_ident = format_ident!("{}", build_spec.build()); let type_ident = format_ident!("{}", build_spec.build());
let annotated_members = build_spec.children() let annotated_members = build_spec
.map(|child| { .children()
make_annotated_member(child) .map(|child| make_annotated_member(child))
})
.filter(Option::is_some) .filter(Option::is_some)
.map(Option::unwrap) .map(Option::unwrap)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let member_names = build_spec.children() let member_names = build_spec
.map(|child| { .children()
make_member_ident(child) .map(|child| make_member_ident(child))
})
.filter(Option::is_some) .filter(Option::is_some)
.map(Option::unwrap) .map(Option::unwrap)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let accessors = build_spec.children() let accessors = build_spec
.map(|child| { .children()
make_accessors(child) .map(|child| make_accessors(child))
})
.filter(Option::is_some) .filter(Option::is_some)
.map(Option::unwrap) .map(Option::unwrap)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
quote! { quote! {
pub struct #type_ident { pub struct #type_ident {
#(#annotated_members),* #(#annotated_members),*