Don't expand macro in single_match suggestion

This commit is contained in:
Philipp Hansch 2018-10-27 14:45:02 +02:00
parent aa7bcb9074
commit af1548f58f
No known key found for this signature in database
GPG Key ID: B6FA06A6E0E2665B
5 changed files with 48 additions and 23 deletions

View File

@ -19,7 +19,8 @@ use crate::syntax::ast::LitKind;
use crate::syntax::source_map::Span; use crate::syntax::source_map::Span;
use crate::utils::paths; use crate::utils::paths;
use crate::utils::{expr_block, is_allowed, is_expn_of, match_qpath, match_type, multispan_sugg, use crate::utils::{expr_block, is_allowed, is_expn_of, match_qpath, match_type, multispan_sugg,
remove_blocks, snippet, span_lint_and_sugg, span_lint_and_then, span_note_and_lint, walk_ptrs_ty}; remove_blocks, snippet, span_lint_and_sugg, span_lint_and_then,
span_note_and_lint, walk_ptrs_ty};
use crate::utils::sugg::Sugg; use crate::utils::sugg::Sugg;
use crate::consts::{constant, Constant}; use crate::consts::{constant, Constant};
use crate::rustc_errors::Applicability; use crate::rustc_errors::Applicability;

View File

@ -406,7 +406,10 @@ pub fn expr_block<'a, 'b, T: LintContext<'b>>(
) -> Cow<'a, str> { ) -> Cow<'a, str> {
let code = snippet_block(cx, expr.span, default); let code = snippet_block(cx, expr.span, default);
let string = option.unwrap_or_default(); let string = option.unwrap_or_default();
if let ExprKind::Block(_, _) = expr.node { if in_macro(expr.span) {
Cow::Owned(format!("{{ {} }}", snippet_with_macro_callsite(cx, expr.span, default)))
}
else if let ExprKind::Block(_, _) = expr.node {
Cow::Owned(format!("{}{}", code, string)) Cow::Owned(format!("{}{}", code, string))
} else if string.is_empty() { } else if string.is_empty() {
Cow::Owned(format!("{{ {} }}", code)) Cow::Owned(format!("{{ {} }}", code))

View File

@ -33,7 +33,7 @@ error: you seem to be trying to use match for destructuring a single pattern. Co
51 | | &(v, 1) => println!("{}", v), 51 | | &(v, 1) => println!("{}", v),
52 | | _ => println!("none"), 52 | | _ => println!("none"),
53 | | } 53 | | }
| |_____^ help: try this: `if let &(v, 1) = tup { $ crate :: io :: _print ( format_args_nl ! ( $ ( $ arg ) * ) ) ; } else { $ crate :: io :: _print ( format_args_nl ! ( $ ( $ arg ) * ) ) ; }` | |_____^ help: try this: `if let &(v, 1) = tup { println!("{}", v) } else { println!("none") }`
error: you don't need to add `&` to all patterns error: you don't need to add `&` to all patterns
--> $DIR/matches.rs:50:5 --> $DIR/matches.rs:50:5

View File

@ -23,6 +23,15 @@ fn single_match(){
_ => () _ => ()
}; };
let x = Some(1u8);
match x {
// Note the missing block braces.
// We suggest `if let Some(y) = x { .. }` because the macro
// is expanded before we can do anything.
Some(y) => println!("{:?}", y),
_ => ()
}
let z = (1u8,1u8); let z = (1u8,1u8);
match z { match z {
(2...3, 7...9) => dummy(), (2...3, 7...9) => dummy(),

View File

@ -12,38 +12,50 @@ error: you seem to be trying to use match for destructuring a single pattern. Co
error: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` error: you seem to be trying to use match for destructuring a single pattern. Consider using `if let`
--> $DIR/single_match.rs:27:5 --> $DIR/single_match.rs:27:5
| |
27 | / match z { 27 | / match x {
28 | | (2...3, 7...9) => dummy(), 28 | | // Note the missing block braces.
29 | | _ => {} 29 | | // We suggest `if let Some(y) = x { .. }` because the macro
30 | | }; 30 | | // is expanded before we can do anything.
31 | | Some(y) => println!("{:?}", y),
32 | | _ => ()
33 | | }
| |_____^ help: try this: `if let Some(y) = x { println!("{:?}", y) }`
error: you seem to be trying to use match for destructuring a single pattern. Consider using `if let`
--> $DIR/single_match.rs:36:5
|
36 | / match z {
37 | | (2...3, 7...9) => dummy(),
38 | | _ => {}
39 | | };
| |_____^ help: try this: `if let (2...3, 7...9) = z { dummy() }` | |_____^ help: try this: `if let (2...3, 7...9) = z { dummy() }`
error: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` error: you seem to be trying to use match for destructuring a single pattern. Consider using `if let`
--> $DIR/single_match.rs:53:5 --> $DIR/single_match.rs:62:5
| |
53 | / match x { 62 | / match x {
54 | | Some(y) => dummy(), 63 | | Some(y) => dummy(),
55 | | None => () 64 | | None => ()
56 | | }; 65 | | };
| |_____^ help: try this: `if let Some(y) = x { dummy() }` | |_____^ help: try this: `if let Some(y) = x { dummy() }`
error: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` error: you seem to be trying to use match for destructuring a single pattern. Consider using `if let`
--> $DIR/single_match.rs:58:5 --> $DIR/single_match.rs:67:5
| |
58 | / match y { 67 | / match y {
59 | | Ok(y) => dummy(), 68 | | Ok(y) => dummy(),
60 | | Err(..) => () 69 | | Err(..) => ()
61 | | }; 70 | | };
| |_____^ help: try this: `if let Ok(y) = y { dummy() }` | |_____^ help: try this: `if let Ok(y) = y { dummy() }`
error: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` error: you seem to be trying to use match for destructuring a single pattern. Consider using `if let`
--> $DIR/single_match.rs:65:5 --> $DIR/single_match.rs:74:5
| |
65 | / match c { 74 | / match c {
66 | | Cow::Borrowed(..) => dummy(), 75 | | Cow::Borrowed(..) => dummy(),
67 | | Cow::Owned(..) => (), 76 | | Cow::Owned(..) => (),
68 | | }; 77 | | };
| |_____^ help: try this: `if let Cow::Borrowed(..) = c { dummy() }` | |_____^ help: try this: `if let Cow::Borrowed(..) = c { dummy() }`
error: aborting due to 5 previous errors error: aborting due to 6 previous errors