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:
parent
dae10c2eef
commit
5d1582be4d
@ -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!(
|
||||||
|
@ -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;
|
|
||||||
|
Loading…
Reference in New Issue
Block a user