Skip to content

Commit

Permalink
Add eprint! to print_with_newline lint
Browse files Browse the repository at this point in the history
  • Loading branch information
justjosias committed Dec 4, 2020
1 parent e59cbbb commit f2952db
Show file tree
Hide file tree
Showing 3 changed files with 190 additions and 0 deletions.
20 changes: 20 additions & 0 deletions clippy_lints/src/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,26 @@ impl EarlyLintPass for Write {
span_lint(cx, PRINT_STDERR, mac.span(), "use of `eprintln!`");
} else if mac.path == sym!(eprint) {
span_lint(cx, PRINT_STDERR, mac.span(), "use of `eprint!`");
if let (Some(fmt_str), _) = self.check_tts(cx, mac.args.inner_tokens(), false) {
if check_newlines(&fmt_str) {
span_lint_and_then(
cx,
PRINT_WITH_NEWLINE,
mac.span(),
"using `eprint!()` with a format string that ends in a single newline",
|err| {
err.multipart_suggestion(
"use `eprintln!` instead",
vec![
(mac.path.span, String::from("eprintln")),
(newline_span(&fmt_str), String::new()),
],
Applicability::MachineApplicable,
);
},
);
}
}
} else if mac.path == sym!(print) {
if !is_build_script(cx) {
span_lint(cx, PRINT_STDOUT, mac.span(), "use of `print!`");
Expand Down
49 changes: 49 additions & 0 deletions tests/ui/eprint_with_newline.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#![allow(clippy::print_literal)]
#![warn(clippy::print_with_newline)]

fn main() {
eprint!("Hello\n");
eprint!("Hello {}\n", "world");
eprint!("Hello {} {}\n", "world", "#2");
eprint!("{}\n", 1265);
eprint!("\n");

// these are all fine
eprint!("");
eprint!("Hello");
eprintln!("Hello");
eprintln!("Hello\n");
eprintln!("Hello {}\n", "world");
eprint!("Issue\n{}", 1265);
eprint!("{}", 1265);
eprint!("\n{}", 1275);
eprint!("\n\n");
eprint!("like eof\n\n");
eprint!("Hello {} {}\n\n", "world", "#2");
eprintln!("\ndon't\nwarn\nfor\nmultiple\nnewlines\n"); // #3126
eprintln!("\nbla\n\n"); // #3126

// Escaping
eprint!("\\n"); // #3514
eprint!("\\\n"); // should fail
eprint!("\\\\n");

// Raw strings
eprint!(r"\n"); // #3778

// Literal newlines should also fail
eprint!(
"
"
);
eprint!(
r"
"
);

// Don't warn on CRLF (#4208)
eprint!("\r\n");
eprint!("foo\r\n");
eprint!("\\r\n"); //~ ERROR
eprint!("foo\rbar\n") // ~ ERROR
}
121 changes: 121 additions & 0 deletions tests/ui/eprint_with_newline.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:5:5
|
LL | eprint!("Hello/n");
| ^^^^^^^^^^^^^^^^^^
|
= note: `-D clippy::print-with-newline` implied by `-D warnings`
help: use `eprintln!` instead
|
LL | eprintln!("Hello");
| ^^^^^^^^ --

error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:6:5
|
LL | eprint!("Hello {}/n", "world");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: use `eprintln!` instead
|
LL | eprintln!("Hello {}", "world");
| ^^^^^^^^ --

error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:7:5
|
LL | eprint!("Hello {} {}/n", "world", "#2");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: use `eprintln!` instead
|
LL | eprintln!("Hello {} {}", "world", "#2");
| ^^^^^^^^ --

error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:8:5
|
LL | eprint!("{}/n", 1265);
| ^^^^^^^^^^^^^^^^^^^^^
|
help: use `eprintln!` instead
|
LL | eprintln!("{}", 1265);
| ^^^^^^^^ --

error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:9:5
|
LL | eprint!("/n");
| ^^^^^^^^^^^^^
|
help: use `eprintln!` instead
|
LL | eprintln!();
| ^^^^^^^^ --

error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:28:5
|
LL | eprint!("//n"); // should fail
| ^^^^^^^^^^^^^^^
|
help: use `eprintln!` instead
|
LL | eprintln!("/"); // should fail
| ^^^^^^^^ --

error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:35:5
|
LL | / eprint!(
LL | | "
LL | | "
LL | | );
| |_____^
|
help: use `eprintln!` instead
|
LL | eprintln!(
LL | ""
|

error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:39:5
|
LL | / eprint!(
LL | | r"
LL | | "
LL | | );
| |_____^
|
help: use `eprintln!` instead
|
LL | eprintln!(
LL | r""
|

error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:47:5
|
LL | eprint!("/r/n"); //~ ERROR
| ^^^^^^^^^^^^^^^^
|
help: use `eprintln!` instead
|
LL | eprintln!("/r"); //~ ERROR
| ^^^^^^^^ --

error: using `eprint!()` with a format string that ends in a single newline
--> $DIR/eprint_with_newline.rs:48:5
|
LL | eprint!("foo/rbar/n") // ~ ERROR
| ^^^^^^^^^^^^^^^^^^^^^
|
help: use `eprintln!` instead
|
LL | eprintln!("foo/rbar") // ~ ERROR
| ^^^^^^^^ --

error: aborting due to 10 previous errors

0 comments on commit f2952db

Please sign in to comment.