Remove multi_field_getter_iter.

This was written because I originally intended to make the fields of the ast node types entirely private, but that made constructing them tedious so they are pub(crate) which coincidentally also allows them to be used by the iterator.
This commit is contained in:
Tom Alexander 2023-09-29 20:38:04 -04:00
parent dae10c2eef
commit 5d1582be4d
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
2 changed files with 3 additions and 44 deletions

View File

@ -3,7 +3,6 @@ use std::marker::PhantomData;
use super::ast_node::AstNode; use super::ast_node::AstNode;
use super::macros::children_iter; use super::macros::children_iter;
use super::macros::empty_iter; use super::macros::empty_iter;
use super::macros::multi_field_getter_iter;
use super::macros::multi_field_iter; use super::macros::multi_field_iter;
use crate::types::AngleLink; use crate::types::AngleLink;
use crate::types::BabelCall; use crate::types::BabelCall;
@ -224,12 +223,12 @@ children_iter!(
PlainListIter, PlainListIter,
std::slice::Iter<'r, PlainListItem<'s>> std::slice::Iter<'r, PlainListItem<'s>>
); );
multi_field_getter_iter!( multi_field_iter!(
PlainListItem<'s>, PlainListItem<'s>,
PlainListItemIter, PlainListItemIter,
get_tag, tag,
std::slice::Iter<'r, Object<'s>>, std::slice::Iter<'r, Object<'s>>,
get_children, children,
std::slice::Iter<'r, Element<'s>> std::slice::Iter<'r, Element<'s>>
); );
children_iter!( children_iter!(

View File

@ -112,43 +112,3 @@ $fieldname: self.$fieldname.iter(),
} }
pub(crate) use multi_field_iter; pub(crate) use multi_field_iter;
/// Create iterators for ast nodes using getters where it has to iterate over multiple child lists.
macro_rules! multi_field_getter_iter {
($astnodetype:ty, $itertype:ident, $firstfieldname: ident, $firstinnertype:ty, $($fieldname: ident, $innertype:ty),*) => {
pub struct $itertype<'r, 's> {
$firstfieldname: $firstinnertype,
$(
$fieldname: $innertype,
),*
}
impl<'r, 's> Iterator for $itertype<'r, 's> {
type Item = AstNode<'r, 's>;
fn next(&mut self) -> Option<Self::Item> {
self.$firstfieldname.next().map(Into::<AstNode>::into)
$(
.or_else(|| self.$fieldname.next().map(Into::<AstNode>::into))
),*
}
}
impl<'r, 's> IntoIterator for &'r $astnodetype {
type Item = AstNode<'r, 's>;
type IntoIter = $itertype<'r, 's>;
fn into_iter(self) -> Self::IntoIter {
$itertype {
$firstfieldname: self.$firstfieldname().iter(),
$(
$fieldname: self.$fieldname().iter(),
),*
}
}
}
};
}
pub(crate) use multi_field_getter_iter;