Skip to content

Commit 26a1e53

Browse files
committed
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.
2 parents 764d687 + b825cdd commit 26a1e53

File tree

4 files changed

+55
-4
lines changed

4 files changed

+55
-4
lines changed

clippy_lints/src/methods/mod.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -2329,13 +2329,20 @@ fn lint_chars_last_cmp_with_unwrap<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, info: &
23292329
fn lint_single_char_pattern<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, _expr: &'tcx hir::Expr, arg: &'tcx hir::Expr) {
23302330
if_chain! {
23312331
if let hir::ExprKind::Lit(lit) = &arg.node;
2332-
if let ast::LitKind::Str(r, _) = lit.node;
2332+
if let ast::LitKind::Str(r, style) = lit.node;
23332333
if r.as_str().len() == 1;
23342334
then {
23352335
let mut applicability = Applicability::MachineApplicable;
23362336
let snip = snippet_with_applicability(cx, arg.span, "..", &mut applicability);
2337-
let c = &snip[1..snip.len() - 1];
2338-
let hint = format!("'{}'", if c == "'" { "\\'" } else { c });
2337+
let ch = if let ast::StrStyle::Raw(nhash) = style {
2338+
let nhash = nhash as usize;
2339+
// for raw string: r##"a"##
2340+
&snip[(nhash + 2)..(snip.len() - 1 - nhash)]
2341+
} else {
2342+
// for regular string: "a"
2343+
&snip[1..(snip.len() - 1)]
2344+
};
2345+
let hint = format!("'{}'", if ch == "'" { "\\'" } else { ch });
23392346
span_lint_and_sugg(
23402347
cx,
23412348
SINGLE_CHAR_PATTERN,

tests/ui/single_char_pattern.fixed

+7
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,11 @@ fn main() {
5353
// Issue #3204
5454
const S: &str = "#";
5555
x.find(S);
56+
57+
// Raw string
58+
x.split('a');
59+
x.split('a');
60+
x.split('a');
61+
x.split('\'');
62+
x.split('#');
5663
}

tests/ui/single_char_pattern.rs

+7
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,11 @@ fn main() {
5353
// Issue #3204
5454
const S: &str = "#";
5555
x.find(S);
56+
57+
// Raw string
58+
x.split(r"a");
59+
x.split(r#"a"#);
60+
x.split(r###"a"###);
61+
x.split(r###"'"###);
62+
x.split(r###"#"###);
5663
}

tests/ui/single_char_pattern.stderr

+31-1
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,35 @@ error: single-character string constant used as pattern
132132
LL | x.starts_with("/x03"); // issue #2996
133133
| ^^^^^^ help: try using a char instead: `'/x03'`
134134

135-
error: aborting due to 22 previous errors
135+
error: single-character string constant used as pattern
136+
--> $DIR/single_char_pattern.rs:58:13
137+
|
138+
LL | x.split(r"a");
139+
| ^^^^ help: try using a char instead: `'a'`
140+
141+
error: single-character string constant used as pattern
142+
--> $DIR/single_char_pattern.rs:59:13
143+
|
144+
LL | x.split(r#"a"#);
145+
| ^^^^^^ help: try using a char instead: `'a'`
146+
147+
error: single-character string constant used as pattern
148+
--> $DIR/single_char_pattern.rs:60:13
149+
|
150+
LL | x.split(r###"a"###);
151+
| ^^^^^^^^^^ help: try using a char instead: `'a'`
152+
153+
error: single-character string constant used as pattern
154+
--> $DIR/single_char_pattern.rs:61:13
155+
|
156+
LL | x.split(r###"'"###);
157+
| ^^^^^^^^^^ help: try using a char instead: `'/''`
158+
159+
error: single-character string constant used as pattern
160+
--> $DIR/single_char_pattern.rs:62:13
161+
|
162+
LL | x.split(r###"#"###);
163+
| ^^^^^^^^^^ help: try using a char instead: `'#'`
164+
165+
error: aborting due to 27 previous errors
136166

0 commit comments

Comments
 (0)