diff options
| author | mcarton <cartonmartin+git@gmail.com> | 2016-01-13 12:57:44 +0100 |
|---|---|---|
| committer | mcarton <cartonmartin+git@gmail.com> | 2016-01-13 13:17:11 +0100 |
| commit | 44daa8bd72d29b281741a6fc11e07faa03d5fb1e (patch) | |
| tree | 6383779b3a95b1cde17a8f45631bcc9bb430b6f9 /src | |
| parent | 9f641a1009e92431b4a49a835c4e80c51ce44c88 (diff) | |
| download | rust-44daa8bd72d29b281741a6fc11e07faa03d5fb1e.tar.gz rust-44daa8bd72d29b281741a6fc11e07faa03d5fb1e.zip | |
Use span_suggestion in matches lints
Ref #442
Diffstat (limited to 'src')
| -rw-r--r-- | src/matches.rs | 100 |
1 files changed, 45 insertions, 55 deletions
diff --git a/src/matches.rs b/src/matches.rs index 217c4abf45b..4cb4df19bf8 100644 --- a/src/matches.rs +++ b/src/matches.rs @@ -9,7 +9,7 @@ use syntax::ast::Lit_::LitBool; use syntax::codemap::Span; use utils::{COW_PATH, OPTION_PATH, RESULT_PATH}; -use utils::{match_type, snippet, span_lint, span_note_and_lint, span_help_and_lint, in_external_macro, expr_block}; +use utils::{match_type, snippet, span_lint, span_note_and_lint, span_lint_and_then, in_external_macro, expr_block}; /// **What it does:** This lint checks for matches with a single arm where an `if let` will usually suffice. It is `Warn` by default. /// @@ -124,15 +124,17 @@ fn check_single_match(cx: &LateContext, ex: &Expr, arms: &[Arm], expr: &Expr) { fn check_single_match_single_pattern(cx: &LateContext, ex: &Expr, arms: &[Arm], expr: &Expr) { if arms[1].pats[0].node == PatWild { - span_help_and_lint(cx, + span_lint_and_then(cx, SINGLE_MATCH, expr.span, - "you seem to be trying to use match for destructuring a single pattern. Consider using \ - `if let`", - &format!("try\nif let {} = {} {}", - snippet(cx, arms[0].pats[0].span, ".."), - snippet(cx, ex.span, ".."), - expr_block(cx, &arms[0].body, None, ".."))); + "you seem to be trying to use match for destructuring a single pattern. \ + Consider using `if let`", |db| { + db.span_suggestion(expr.span, "try this", + format!("if let {} = {} {}", + snippet(cx, arms[0].pats[0].span, ".."), + snippet(cx, ex.span, ".."), + expr_block(cx, &arms[0].body, None, ".."))); + }); } } @@ -156,15 +158,17 @@ fn check_single_match_opt_like(cx: &LateContext, ex: &Expr, arms: &[Arm], expr: for &(ty_path, pat_path) in candidates { if &path == pat_path && match_type(cx, ty, ty_path) { - span_help_and_lint(cx, + span_lint_and_then(cx, SINGLE_MATCH, expr.span, - "you seem to be trying to use match for destructuring a single pattern. Consider using \ - `if let`", - &format!("try\nif let {} = {} {}", - snippet(cx, arms[0].pats[0].span, ".."), - snippet(cx, ex.span, ".."), - expr_block(cx, &arms[0].body, None, ".."))); + "you seem to be trying to use match for destructuring a single pattern. \ + Consider using `if let`", |db| { + db.span_suggestion(expr.span, "try this", + format!("if let {} = {} {}", + snippet(cx, arms[0].pats[0].span, ".."), + snippet(cx, ex.span, ".."), + expr_block(cx, &arms[0].body, None, ".."))); + }); } } } @@ -172,7 +176,7 @@ fn check_single_match_opt_like(cx: &LateContext, ex: &Expr, arms: &[Arm], expr: fn check_match_bool(cx: &LateContext, ex: &Expr, arms: &[Arm], expr: &Expr) { // type of expression == bool if cx.tcx.expr_ty(ex).sty == ty::TyBool { - if arms.len() == 2 && arms[0].pats.len() == 1 { + let sugg = if arms.len() == 2 && arms[0].pats.len() == 1 { // no guards let exprs = if let PatLit(ref arm_bool) = arms[0].pats[0].node { if let ExprLit(ref lit) = arm_bool.node { @@ -187,56 +191,42 @@ fn check_match_bool(cx: &LateContext, ex: &Expr, arms: &[Arm], expr: &Expr) { } else { None }; + if let Some((ref true_expr, ref false_expr)) = exprs { if !is_unit_expr(true_expr) { if !is_unit_expr(false_expr) { - span_help_and_lint(cx, - MATCH_BOOL, - expr.span, - "you seem to be trying to match on a boolean expression. Consider using \ - an if..else block:", - &format!("try\nif {} {} else {}", - snippet(cx, ex.span, "b"), - expr_block(cx, true_expr, None, ".."), - expr_block(cx, false_expr, None, ".."))); + Some(format!("if {} {} else {}", + snippet(cx, ex.span, "b"), + expr_block(cx, true_expr, None, ".."), + expr_block(cx, false_expr, None, ".."))) } else { - span_help_and_lint(cx, - MATCH_BOOL, - expr.span, - "you seem to be trying to match on a boolean expression. Consider using \ - an if..else block:", - &format!("try\nif {} {}", - snippet(cx, ex.span, "b"), - expr_block(cx, true_expr, None, ".."))); + Some(format!("if {} {}", + snippet(cx, ex.span, "b"), + expr_block(cx, true_expr, None, ".."))) } } else if !is_unit_expr(false_expr) { - span_help_and_lint(cx, - MATCH_BOOL, - expr.span, - "you seem to be trying to match on a boolean expression. Consider using an \ - if..else block:", - &format!("try\nif !{} {}", - snippet(cx, ex.span, "b"), - expr_block(cx, false_expr, None, ".."))); + Some(format!("try\nif !{} {}", + snippet(cx, ex.span, "b"), + expr_block(cx, false_expr, None, ".."))) } else { - span_lint(cx, - MATCH_BOOL, - expr.span, - "you seem to be trying to match on a boolean expression. Consider using an if..else \ - block"); + None } } else { - span_lint(cx, - MATCH_BOOL, - expr.span, - "you seem to be trying to match on a boolean expression. Consider using an if..else block"); + None } } else { - span_lint(cx, - MATCH_BOOL, - expr.span, - "you seem to be trying to match on a boolean expression. Consider using an if..else block"); - } + None + }; + + span_lint_and_then(cx, + MATCH_BOOL, + expr.span, + "you seem to be trying to match on a boolean expression. Consider using \ + an if..else block:", move |db| { + if let Some(ref sugg) = sugg { + db.span_suggestion(expr.span, "try this", sugg.clone()); + } + }); } } |
