Skip to content

Commit c60107a

Browse files
committed
raw_strings: handle format template as well
1 parent 9a7dd0a commit c60107a

7 files changed

+123
-3
lines changed

clippy_lints/src/raw_strings.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use clippy_config::Conf;
22
use clippy_utils::diagnostics::span_lint_and_then;
3-
use clippy_utils::source::SpanRangeExt;
3+
use clippy_utils::source::{SpanRangeExt, snippet_opt};
44
use rustc_ast::ast::{Expr, ExprKind};
55
use rustc_ast::token::LitKind;
66
use rustc_errors::Applicability;
@@ -71,6 +71,16 @@ impl RawStrings {
7171

7272
impl EarlyLintPass for RawStrings {
7373
fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
74+
if let ExprKind::FormatArgs(format_args) = &expr.kind
75+
&& !in_external_macro(cx.sess(), format_args.span)
76+
&& format_args.span.check_source_text(cx, |src| src.starts_with('r'))
77+
&& let Some(str) = snippet_opt(cx.sess(), format_args.span)
78+
{
79+
let count_hash = str.bytes().skip(1).take_while(|b| *b == b'#').count();
80+
let str = &str[count_hash + 2..str.len() - count_hash - 1];
81+
self.check_raw_string(cx, str, format_args.span, "r", count_hash as u8, "string");
82+
}
83+
7484
if let ExprKind::Lit(lit) = expr.kind
7585
&& let (prefix, max) = match lit.kind {
7686
LitKind::StrRaw(max) => ("r", max),

tests/ui/needless_raw_string.fixed

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,12 @@ fn main() {
2222
b"no hashes";
2323
c"no hashes";
2424
}
25+
26+
fn issue_13503() {
27+
println!("SELECT * FROM posts");
28+
println!("SELECT * FROM posts");
29+
println!(r##"SELECT * FROM "posts""##);
30+
31+
// Test arguments as well
32+
println!("{}", "foobar".len());
33+
}

tests/ui/needless_raw_string.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,12 @@ fn main() {
2222
br"no hashes";
2323
cr"no hashes";
2424
}
25+
26+
fn issue_13503() {
27+
println!(r"SELECT * FROM posts");
28+
println!(r#"SELECT * FROM posts"#);
29+
println!(r##"SELECT * FROM "posts""##);
30+
31+
// Test arguments as well
32+
println!("{}", r"foobar".len());
33+
}

tests/ui/needless_raw_string.stderr

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,41 @@ LL - cr"no hashes";
9191
LL + c"no hashes";
9292
|
9393

94-
error: aborting due to 7 previous errors
94+
error: unnecessary raw string literal
95+
--> tests/ui/needless_raw_string.rs:27:14
96+
|
97+
LL | println!(r"SELECT * FROM posts");
98+
| ^^^^^^^^^^^^^^^^^^^^^^
99+
|
100+
help: use a plain string literal instead
101+
|
102+
LL - println!(r"SELECT * FROM posts");
103+
LL + println!("SELECT * FROM posts");
104+
|
105+
106+
error: unnecessary raw string literal
107+
--> tests/ui/needless_raw_string.rs:28:14
108+
|
109+
LL | println!(r#"SELECT * FROM posts"#);
110+
| ^^^^^^^^^^^^^^^^^^^^^^^^
111+
|
112+
help: use a plain string literal instead
113+
|
114+
LL - println!(r#"SELECT * FROM posts"#);
115+
LL + println!("SELECT * FROM posts");
116+
|
117+
118+
error: unnecessary raw string literal
119+
--> tests/ui/needless_raw_string.rs:32:20
120+
|
121+
LL | println!("{}", r"foobar".len());
122+
| ^^^^^^^^^
123+
|
124+
help: use a plain string literal instead
125+
|
126+
LL - println!("{}", r"foobar".len());
127+
LL + println!("{}", "foobar".len());
128+
|
129+
130+
error: aborting due to 10 previous errors
95131

tests/ui/needless_raw_string_hashes.fixed

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,13 @@ fn main() {
2424
r"rust";
2525
r"hello world";
2626
}
27+
28+
fn issue_13503() {
29+
println!(r"SELECT * FROM posts");
30+
println!(r"SELECT * FROM posts");
31+
println!(r#"SELECT * FROM "posts""#);
32+
println!(r#"SELECT * FROM "posts""#);
33+
34+
// Test arguments as well
35+
println!("{}", r"foobar".len());
36+
}

tests/ui/needless_raw_string_hashes.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,13 @@ fn main() {
2424
r###"rust"###;
2525
r#"hello world"#;
2626
}
27+
28+
fn issue_13503() {
29+
println!(r"SELECT * FROM posts");
30+
println!(r#"SELECT * FROM posts"#);
31+
println!(r##"SELECT * FROM "posts""##);
32+
println!(r##"SELECT * FROM "posts""##);
33+
34+
// Test arguments as well
35+
println!("{}", r"foobar".len());
36+
}

tests/ui/needless_raw_string_hashes.stderr

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,5 +187,41 @@ LL - r#"hello world"#;
187187
LL + r"hello world";
188188
|
189189

190-
error: aborting due to 15 previous errors
190+
error: unnecessary hashes around raw string literal
191+
--> tests/ui/needless_raw_string_hashes.rs:30:14
192+
|
193+
LL | println!(r#"SELECT * FROM posts"#);
194+
| ^^^^^^^^^^^^^^^^^^^^^^^^
195+
|
196+
help: remove all the hashes around the string literal
197+
|
198+
LL - println!(r#"SELECT * FROM posts"#);
199+
LL + println!(r"SELECT * FROM posts");
200+
|
201+
202+
error: unnecessary hashes around raw string literal
203+
--> tests/ui/needless_raw_string_hashes.rs:31:14
204+
|
205+
LL | println!(r##"SELECT * FROM "posts""##);
206+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
207+
|
208+
help: remove one hash from both sides of the string literal
209+
|
210+
LL - println!(r##"SELECT * FROM "posts""##);
211+
LL + println!(r#"SELECT * FROM "posts""#);
212+
|
213+
214+
error: unnecessary hashes around raw string literal
215+
--> tests/ui/needless_raw_string_hashes.rs:32:14
216+
|
217+
LL | println!(r##"SELECT * FROM "posts""##);
218+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
219+
|
220+
help: remove one hash from both sides of the string literal
221+
|
222+
LL - println!(r##"SELECT * FROM "posts""##);
223+
LL + println!(r#"SELECT * FROM "posts""#);
224+
|
225+
226+
error: aborting due to 18 previous errors
191227

0 commit comments

Comments
 (0)