Address reviews
This commit is contained in:
parent
0579c3e0aa
commit
adcc02ed8a
@ -488,7 +488,7 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
|
||||
},
|
||||
NeverLoopResult::MayContinueMainLoop | NeverLoopResult::Otherwise => (),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// check for `loop { if let {} else break }` that could be `while let`
|
||||
// (also matches an explicit "match" instead of "if let")
|
||||
@ -587,16 +587,8 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
|
||||
}
|
||||
}
|
||||
|
||||
if_chain! {
|
||||
if let ExprKind::Loop(block, _, LoopSource::While) = &expr.node;
|
||||
if let Block { expr: Some(expr), .. } = &**block;
|
||||
if let ExprKind::Match(cond, arms, MatchSource::WhileDesugar) = &expr.node;
|
||||
if let ExprKind::DropTemps(cond) = &cond.node;
|
||||
if let [arm, ..] = &arms[..];
|
||||
if let Arm { body, .. } = arm;
|
||||
then {
|
||||
check_infinite_loop(cx, cond, body);
|
||||
}
|
||||
if let Some((cond, body)) = higher::while_loop(&expr) {
|
||||
check_infinite_loop(cx, cond, body);
|
||||
}
|
||||
|
||||
check_needless_collect(expr, cx);
|
||||
|
@ -702,7 +702,7 @@ fn loop_desugaring_name(des: hir::LoopSource) -> &'static str {
|
||||
match des {
|
||||
hir::LoopSource::ForLoop => "LoopSource::ForLoop",
|
||||
hir::LoopSource::Loop => "LoopSource::Loop",
|
||||
hir::LoopSource::While => "LoopSource::WhileDesugar",
|
||||
hir::LoopSource::While => "LoopSource::While",
|
||||
hir::LoopSource::WhileLet => "LoopSource::WhileLet",
|
||||
}
|
||||
}
|
||||
|
@ -199,6 +199,23 @@ pub fn for_loop(expr: &hir::Expr) -> Option<(&hir::Pat, &hir::Expr, &hir::Expr)>
|
||||
None
|
||||
}
|
||||
|
||||
/// Recover the essential nodes of a desugared while loop:
|
||||
/// `while cond { body }` becomes `(cond, body)`.
|
||||
pub fn while_loop(expr: &hir::Expr) -> Option<(&hir::Expr, &hir::Expr)> {
|
||||
if_chain! {
|
||||
if let hir::ExprKind::Loop(block, _, hir::LoopSource::While) = &expr.node;
|
||||
if let hir::Block { expr: Some(expr), .. } = &**block;
|
||||
if let hir::ExprKind::Match(cond, arms, hir::MatchSource::WhileDesugar) = &expr.node;
|
||||
if let hir::ExprKind::DropTemps(cond) = &cond.node;
|
||||
if let [arm, ..] = &arms[..];
|
||||
if let hir::Arm { body, .. } = arm;
|
||||
then {
|
||||
return Some((cond, body));
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
/// Recover the essential nodes of a desugared if block
|
||||
/// `if cond { then } else { els }` becomes `(cond, then, Some(els))`
|
||||
pub fn if_block(expr: &hir::Expr) -> Option<(&hir::Expr, &hir::Expr, Option<&hir::Expr>)> {
|
||||
|
Loading…
Reference in New Issue
Block a user