Store else token together with else branch
diff --git a/src/expr.rs b/src/expr.rs
index 76c666f..e50cf3a 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -104,9 +104,8 @@
pub attrs: Vec<Attribute>,
pub if_token: Token![if],
pub cond: Box<Expr>,
- pub if_true: Block,
- pub else_token: Option<Token![else]>,
- pub if_false: Option<Box<Expr>>,
+ pub then_branch: Block,
+ pub else_branch: Option<(Token![else], Box<Expr>)>,
}),
/// An `if let` expression with an optional else block
@@ -121,9 +120,8 @@
pub pat: Box<Pat>,
pub eq_token: Token![=],
pub expr: Box<Expr>,
- pub if_true: Block,
- pub else_token: Option<Token![else]>,
- pub if_false: Option<Box<Expr>>,
+ pub then_branch: Block,
+ pub else_branch: Option<(Token![else], Box<Expr>)>,
}),
/// A while loop, with an optional label
@@ -748,7 +746,9 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
- use ty::parsing::{qpath, ty_no_eq_after};
+ use ty::parsing::qpath;
+ #[cfg(feature = "full")]
+ use ty::parsing::ty_no_eq_after;
#[cfg(feature = "full")]
use proc_macro2::{Delimiter, Span, TokenNode, TokenStream};
@@ -1476,13 +1476,12 @@
let_token: let_,
eq_token: eq,
expr: Box::new(cond),
- if_true: Block {
+ then_branch: Block {
stmts: then_block.0,
brace_token: then_block.1,
},
if_token: if_,
- else_token: else_block.as_ref().map(|p| Token.0)),
- if_false: else_block.map(|p| Box::new(p.1.into())),
+ else_branch: else_block,
})
));
}
@@ -1497,19 +1496,18 @@
(ExprIf {
attrs: Vec::new(),
cond: Box::new(cond),
- if_true: Block {
+ then_branch: Block {
stmts: then_block.0,
brace_token: then_block.1,
},
if_token: if_,
- else_token: else_block.as_ref().map(|p| Token.0)),
- if_false: else_block.map(|p| Box::new(p.1.into())),
+ else_branch: else_block,
})
));
}
#[cfg(feature = "full")]
- named!(else_block -> (Token![else], Expr), do_parse!(
+ named!(else_block -> (Token![else], Box<Expr>), do_parse!(
else_: keyword!(else) >>
expr: alt!(
syn!(ExprIf) => { Expr::If }
@@ -1527,7 +1525,7 @@
}))
)
) >>
- (else_, expr)
+ (else_, Box::new(expr))
));
#[cfg(feature = "full")]
@@ -2564,21 +2562,20 @@
#[cfg(feature = "full")]
fn maybe_wrap_else(
tokens: &mut Tokens,
- else_token: &Option<Token![else]>,
- if_false: &Option<Box<Expr>>,
+ else_: &Option<(Token![else], Box<Expr>)>,
) {
- if let Some(ref if_false) = *if_false {
- TokensOrDefault(else_token).to_tokens(tokens);
+ if let Some((ref else_token, ref else_)) = *else_ {
+ else_token.to_tokens(tokens);
// If we are not one of the valid expressions to exist in an else
// clause, wrap ourselves in a block.
- match **if_false {
+ match **else_ {
Expr::If(_) | Expr::IfLet(_) | Expr::Block(_) => {
- if_false.to_tokens(tokens);
+ else_.to_tokens(tokens);
}
_ => {
token::Brace::default().surround(tokens, |tokens| {
- if_false.to_tokens(tokens);
+ else_.to_tokens(tokens);
});
}
}
@@ -2591,8 +2588,8 @@
tokens.append_all(self.attrs.outer());
self.if_token.to_tokens(tokens);
wrap_bare_struct(tokens, &self.cond);
- self.if_true.to_tokens(tokens);
- maybe_wrap_else(tokens, &self.else_token, &self.if_false);
+ self.then_branch.to_tokens(tokens);
+ maybe_wrap_else(tokens, &self.else_branch);
}
}
@@ -2605,8 +2602,8 @@
self.pat.to_tokens(tokens);
self.eq_token.to_tokens(tokens);
wrap_bare_struct(tokens, &self.expr);
- self.if_true.to_tokens(tokens);
- maybe_wrap_else(tokens, &self.else_token, &self.if_false);
+ self.then_branch.to_tokens(tokens);
+ maybe_wrap_else(tokens, &self.else_branch);
}
}