feat: allow ifchains and for loops

This commit is contained in:
Jonathan Kelley committed 2023-01-13 10:51:12 -08:00
1 parent 2dd2d7fe66
commit 6cd87796f2
6 files changed
+82 -29

No files matched your search

+31 -19
View File
@@ -95,25 +95,7 @@ impl Parse for BodyNode {
// Transform for loops into into_iter calls
if stream.peek(Token![for]) {
let _f = stream.parse::<Token![for]>()?;
let pat = stream.parse::<Pat>()?;
let _i = stream.parse::<Token![in]>()?;
let expr = stream.parse::<Box<Expr>>()?;
let body;
braced!(body in stream);
let mut children = vec![];
while !body.is_empty() {
children.push(body.parse()?);
}
return Ok(BodyNode::ForLoop(ForLoop {
for_token: _f,
pat,
in_token: _i,
expr,
body: children,
}));
return Ok(BodyNode::ForLoop(stream.parse()?));
}
// Transform unterminated if statements into terminated optional if statements
@@ -221,6 +203,36 @@ pub struct ForLoop {
pub in_token: Token![in],
pub expr: Box<Expr>,
pub body: Vec<BodyNode>,
pub brace_token: token::Brace,
}
impl Parse for ForLoop {
fn parse(input: ParseStream) -> Result<Self> {
let for_token: Token![for] = input.parse()?;
let pat = input.parse()?;
let in_token: Token![in] = input.parse()?;
let expr: Expr = input.call(Expr::parse_without_eager_brace)?;
let content;
let brace_token = braced!(content in input);
let mut children = vec![];
while !content.is_empty() {
children.push(content.parse()?);
}
Ok(Self {
for_token,
pat,
in_token,
body: children,
expr: Box::new(expr),
brace_token,
})
}
}
fn is_if_chain_terminated(chain: &ExprIf) -> bool {