mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-23 21:23:56 +00:00
Auto merge of #4361 - lzutao:fix-raw-string-on-single_char_pattern, r=phansch
Fix lint_single_char_pattern on raw string literal Closes #4356 changelog: Handle raw string literal on `single_char_literal` lint.
This commit is contained in:
commit
26a1e532e6
4 changed files with 55 additions and 4 deletions
|
@ -2329,13 +2329,20 @@ fn lint_chars_last_cmp_with_unwrap<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, info: &
|
||||||
fn lint_single_char_pattern<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, _expr: &'tcx hir::Expr, arg: &'tcx hir::Expr) {
|
fn lint_single_char_pattern<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, _expr: &'tcx hir::Expr, arg: &'tcx hir::Expr) {
|
||||||
if_chain! {
|
if_chain! {
|
||||||
if let hir::ExprKind::Lit(lit) = &arg.node;
|
if let hir::ExprKind::Lit(lit) = &arg.node;
|
||||||
if let ast::LitKind::Str(r, _) = lit.node;
|
if let ast::LitKind::Str(r, style) = lit.node;
|
||||||
if r.as_str().len() == 1;
|
if r.as_str().len() == 1;
|
||||||
then {
|
then {
|
||||||
let mut applicability = Applicability::MachineApplicable;
|
let mut applicability = Applicability::MachineApplicable;
|
||||||
let snip = snippet_with_applicability(cx, arg.span, "..", &mut applicability);
|
let snip = snippet_with_applicability(cx, arg.span, "..", &mut applicability);
|
||||||
let c = &snip[1..snip.len() - 1];
|
let ch = if let ast::StrStyle::Raw(nhash) = style {
|
||||||
let hint = format!("'{}'", if c == "'" { "\\'" } else { c });
|
let nhash = nhash as usize;
|
||||||
|
// for raw string: r##"a"##
|
||||||
|
&snip[(nhash + 2)..(snip.len() - 1 - nhash)]
|
||||||
|
} else {
|
||||||
|
// for regular string: "a"
|
||||||
|
&snip[1..(snip.len() - 1)]
|
||||||
|
};
|
||||||
|
let hint = format!("'{}'", if ch == "'" { "\\'" } else { ch });
|
||||||
span_lint_and_sugg(
|
span_lint_and_sugg(
|
||||||
cx,
|
cx,
|
||||||
SINGLE_CHAR_PATTERN,
|
SINGLE_CHAR_PATTERN,
|
||||||
|
|
|
@ -53,4 +53,11 @@ fn main() {
|
||||||
// Issue #3204
|
// Issue #3204
|
||||||
const S: &str = "#";
|
const S: &str = "#";
|
||||||
x.find(S);
|
x.find(S);
|
||||||
|
|
||||||
|
// Raw string
|
||||||
|
x.split('a');
|
||||||
|
x.split('a');
|
||||||
|
x.split('a');
|
||||||
|
x.split('\'');
|
||||||
|
x.split('#');
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,4 +53,11 @@ fn main() {
|
||||||
// Issue #3204
|
// Issue #3204
|
||||||
const S: &str = "#";
|
const S: &str = "#";
|
||||||
x.find(S);
|
x.find(S);
|
||||||
|
|
||||||
|
// Raw string
|
||||||
|
x.split(r"a");
|
||||||
|
x.split(r#"a"#);
|
||||||
|
x.split(r###"a"###);
|
||||||
|
x.split(r###"'"###);
|
||||||
|
x.split(r###"#"###);
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,5 +132,35 @@ error: single-character string constant used as pattern
|
||||||
LL | x.starts_with("/x03"); // issue #2996
|
LL | x.starts_with("/x03"); // issue #2996
|
||||||
| ^^^^^^ help: try using a char instead: `'/x03'`
|
| ^^^^^^ help: try using a char instead: `'/x03'`
|
||||||
|
|
||||||
error: aborting due to 22 previous errors
|
error: single-character string constant used as pattern
|
||||||
|
--> $DIR/single_char_pattern.rs:58:13
|
||||||
|
|
|
||||||
|
LL | x.split(r"a");
|
||||||
|
| ^^^^ help: try using a char instead: `'a'`
|
||||||
|
|
||||||
|
error: single-character string constant used as pattern
|
||||||
|
--> $DIR/single_char_pattern.rs:59:13
|
||||||
|
|
|
||||||
|
LL | x.split(r#"a"#);
|
||||||
|
| ^^^^^^ help: try using a char instead: `'a'`
|
||||||
|
|
||||||
|
error: single-character string constant used as pattern
|
||||||
|
--> $DIR/single_char_pattern.rs:60:13
|
||||||
|
|
|
||||||
|
LL | x.split(r###"a"###);
|
||||||
|
| ^^^^^^^^^^ help: try using a char instead: `'a'`
|
||||||
|
|
||||||
|
error: single-character string constant used as pattern
|
||||||
|
--> $DIR/single_char_pattern.rs:61:13
|
||||||
|
|
|
||||||
|
LL | x.split(r###"'"###);
|
||||||
|
| ^^^^^^^^^^ help: try using a char instead: `'/''`
|
||||||
|
|
||||||
|
error: single-character string constant used as pattern
|
||||||
|
--> $DIR/single_char_pattern.rs:62:13
|
||||||
|
|
|
||||||
|
LL | x.split(r###"#"###);
|
||||||
|
| ^^^^^^^^^^ help: try using a char instead: `'#'`
|
||||||
|
|
||||||
|
error: aborting due to 27 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue