mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-10 23:24:24 +00:00
Add smarter macro check for block_in_if (fixes #528)
This commit is contained in:
parent
32cf6e32f6
commit
a745efd566
3 changed files with 19 additions and 1 deletions
|
@ -79,13 +79,18 @@ impl LateLintPass for BlockInIfCondition {
|
|||
if let Some(ref ex) = block.expr {
|
||||
// don't dig into the expression here, just suggest that they remove
|
||||
// the block
|
||||
|
||||
if differing_macro_contexts(expr.span, ex.span) {
|
||||
return;
|
||||
}
|
||||
span_help_and_lint(cx, BLOCK_IN_IF_CONDITION_EXPR, check.span,
|
||||
BRACED_EXPR_MESSAGE,
|
||||
&format!("try\nif {} {} ... ", snippet_block(cx, ex.span, ".."),
|
||||
snippet_block(cx, then.span, "..")));
|
||||
}
|
||||
} else {
|
||||
if differing_macro_contexts(expr.span, block.stmts[0].span) {
|
||||
return;
|
||||
}
|
||||
// move block higher
|
||||
span_help_and_lint(cx, BLOCK_IN_IF_CONDITION_STMT, check.span,
|
||||
COMPLEX_BLOCK_MESSAGE,
|
||||
|
|
|
@ -74,6 +74,10 @@ macro_rules! if_let_chain {
|
|||
};
|
||||
}
|
||||
|
||||
/// Returns true if the two spans come from differing expansions (i.e. one is from a macro and one isn't)
|
||||
pub fn differing_macro_contexts(sp1: Span, sp2: Span) -> bool {
|
||||
sp1.expn_id != sp2.expn_id
|
||||
}
|
||||
/// returns true if this expn_info was expanded by any macro
|
||||
pub fn in_macro<T: LintContext>(cx: &T, span: Span) -> bool {
|
||||
cx.sess().codemap().with_expn_info(span.expn_id,
|
||||
|
|
|
@ -5,6 +5,15 @@
|
|||
#![deny(block_in_if_condition_stmt)]
|
||||
#![allow(unused)]
|
||||
|
||||
|
||||
macro_rules! blocky {
|
||||
() => {{true}}
|
||||
}
|
||||
|
||||
fn macro_if() {
|
||||
if blocky!() {
|
||||
}
|
||||
}
|
||||
fn condition_has_block() -> i32 {
|
||||
|
||||
if { //~ERROR in an 'if' condition, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a 'let'
|
||||
|
|
Loading…
Reference in a new issue