Fix missing box.
This commit is contained in:
parent
8a6e4277a7
commit
12c565d0e1
@ -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),*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user