use crate::ast::prelude::*;
#[test]
#[cfg(not(miri))]
fn ast_parse() {
rt::<ast::ExprFor>("for i in x {}");
rt::<ast::ExprFor>("for (a, _) in x {}");
rt::<ast::ExprFor>("'label: for i in x {}");
rt::<ast::ExprFor>("#[attr] 'label: for i in x {}");
}
#[derive(Debug, TryClone, PartialEq, Eq, ToTokens, Spanned)]
#[non_exhaustive]
pub struct ExprFor {
#[rune(iter)]
pub attributes: Vec<ast::Attribute>,
#[rune(iter)]
pub label: Option<(ast::Label, T![:])>,
pub for_token: T![for],
pub binding: ast::Pat,
pub in_: T![in],
pub iter: Box<ast::Expr>,
pub body: Box<ast::Block>,
}
impl ExprFor {
pub(crate) fn parse_with_meta(
parser: &mut Parser<'_>,
attributes: Vec<ast::Attribute>,
label: Option<(ast::Label, T![:])>,
) -> Result<Self> {
Ok(Self {
attributes,
label,
for_token: parser.parse()?,
binding: parser.parse()?,
in_: parser.parse()?,
iter: Box::try_new(ast::Expr::parse_without_eager_brace(parser)?)?,
body: Box::try_new(parser.parse()?)?,
})
}
}
expr_parse!(For, ExprFor, "for loop expression");