/// `if a { c } else if b { d } else { e }`.
fn if_sequence(mut expr: &Expr) -> (SmallVector<&Expr>, SmallVector<&Block>) {
let mut conds = SmallVector::new();
- let mut blocks = SmallVector::new();
+ let mut blocks : SmallVector<&Block> = SmallVector::new();
while let ExprIf(ref cond, ref then_expr, ref else_expr) = expr.node {
conds.push(&**cond);
- //FIXME
- //blocks.push(&**then_expr);
- //FIXME
+ if let ExprBlock(ref block) = then_expr.node {
+ blocks.push(&block);
+ } else {
+ panic!("ExprIf node is not an ExprBlock");
+ }
if let Some(ref else_expr) = *else_expr {
expr = else_expr;
// final `else {..}`
if !blocks.is_empty() {
if let ExprBlock(ref block) = expr.node {
- //FIXME
- //blocks.push(&**block);
- //FIXME
+ blocks.push(&**block);
}
}
return None;
} else if exprs.len() == 2 {
return if eq(&exprs[0], &exprs[1]) {
- Some((&exprs[0], &exprs[1]))
- } else {
- None
- };
+ Some((&exprs[0], &exprs[1]))
+ } else {
+ None
+ };
}
let mut map: HashMap<_, Vec<&_>> = HashMap::with_capacity(exprs.len());
if let Some((ty, map, key)) = check_cond(cx, check) {
// in case of `if !m.contains_key(&k) { m.insert(k, v); }`
// we can give a better error message
- let sole_expr = else_block.is_none();
+ let sole_expr = {
+ else_block.is_none() &&
+ if let ExprBlock(ref then_block) = then_block.node {
+ (then_block.expr.is_some() as usize) + then_block.stmts.len() == 1
+ } else {
+ true
+ }
+ };
let mut visitor = InsertVisitor {
cx: cx,
let hir::StmtExpr(ref if_, _) = expr.node,
let hir::ExprIf(ref cond, ref then, ref else_) = if_.node,
!used_in_expr(cx, def_id, cond),
- !used_in_expr(cx, def_id, &**then),
+ !used_in_expr(cx, def_id, &*then),
+ let hir::ExprBlock(ref then) = then.node,
+ let Some(value) = check_assign(cx, def_id, &*then),
], {
let span = Span { lo: stmt.span.lo, hi: if_.span.hi, ctxt: NO_EXPANSION };
mut=mutability,
name=name.node,
cond=snippet(cx, cond.span, "_"),
- then={ "" },
+ then=if then.stmts.len() > 1 { " ..;" } else { "" },
else=if default_multi_stmts { " ..;" } else { "" },
value=snippet(cx, then.span, "<value>"),
default=snippet(cx, default.span, "<default>"),