Made parens addition smarter and added tests with bless

This commit is contained in:
boolean_coercion 2021-02-13 00:33:08 +02:00
parent 642efabfbb
commit d36fe85569
3 changed files with 45 additions and 13 deletions

View File

@ -5,6 +5,7 @@ use rustc_lint::{LateContext, LateLintPass};
use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_session::{declare_lint_pass, declare_tool_lint};
use crate::utils::span_lint_and_sugg; use crate::utils::span_lint_and_sugg;
use crate::utils::sugg::Sugg;
declare_clippy_lint! { declare_clippy_lint! {
/// **What it does:** /// **What it does:**
@ -58,14 +59,20 @@ impl LateLintPass<'tcx> for FromStrRadix10 {
if let rustc_ast::ast::LitKind::Int(10, _) = lit.node; if let rustc_ast::ast::LitKind::Int(10, _) = lit.node;
then { then {
let orig_string = crate::utils::snippet(cx, arguments[0].span, "string"); let sugg = Sugg::hir_with_applicability(
cx,
&arguments[0],
"<string>",
&mut Applicability::MachineApplicable
).maybe_par();
span_lint_and_sugg( span_lint_and_sugg(
cx, cx,
FROM_STR_RADIX_10, FROM_STR_RADIX_10,
exp.span, exp.span,
"this call to `from_str_radix` can be replaced with a call to `str::parse`", "this call to `from_str_radix` can be replaced with a call to `str::parse`",
"try", "try",
format!("({}).parse()", orig_string), format!("{}.parse::<{}>()", sugg, prim_ty.name_str()),
Applicability::MaybeIncorrect Applicability::MaybeIncorrect
); );
} }

View File

@ -12,12 +12,25 @@ fn from_str_radix(_: &str, _: u32) -> Result<(), std::num::ParseIntError> {
unimplemented!() unimplemented!()
} }
// to test parenthesis addition
struct Test;
impl std::ops::Add<Test> for Test {
type Output = &'static str;
fn add(self, _: Self) -> Self::Output {
"304"
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
// all of these should trigger the lint // all of these should trigger the lint
u32::from_str_radix("30", 10)?; u32::from_str_radix("30", 10)?;
i64::from_str_radix("24", 10)?; i64::from_str_radix("24", 10)?;
isize::from_str_radix("100", 10)?; isize::from_str_radix("100", 10)?;
u8::from_str_radix("7", 10)?; u8::from_str_radix("7", 10)?;
u16::from_str_radix(&("10".to_owned() + "5"), 10)?;
i128::from_str_radix(Test + Test, 10)?;
let string = "300"; let string = "300";
i32::from_str_radix(string, 10)?; i32::from_str_radix(string, 10)?;

View File

@ -1,34 +1,46 @@
error: this call to `from_str_radix` can be replaced with a call to `str::parse` error: this call to `from_str_radix` can be replaced with a call to `str::parse`
--> $DIR/from_str_radix_10.rs:17:5 --> $DIR/from_str_radix_10.rs:28:5
| |
LL | u32::from_str_radix("30", 10)?; LL | u32::from_str_radix("30", 10)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("30").parse()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"30".parse::<u32>()`
| |
= note: `-D clippy::from-str-radix-10` implied by `-D warnings` = note: `-D clippy::from-str-radix-10` implied by `-D warnings`
error: this call to `from_str_radix` can be replaced with a call to `str::parse` error: this call to `from_str_radix` can be replaced with a call to `str::parse`
--> $DIR/from_str_radix_10.rs:18:5 --> $DIR/from_str_radix_10.rs:29:5
| |
LL | i64::from_str_radix("24", 10)?; LL | i64::from_str_radix("24", 10)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("24").parse()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"24".parse::<i64>()`
error: this call to `from_str_radix` can be replaced with a call to `str::parse` error: this call to `from_str_radix` can be replaced with a call to `str::parse`
--> $DIR/from_str_radix_10.rs:19:5 --> $DIR/from_str_radix_10.rs:30:5
| |
LL | isize::from_str_radix("100", 10)?; LL | isize::from_str_radix("100", 10)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("100").parse()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"100".parse::<isize>()`
error: this call to `from_str_radix` can be replaced with a call to `str::parse` error: this call to `from_str_radix` can be replaced with a call to `str::parse`
--> $DIR/from_str_radix_10.rs:20:5 --> $DIR/from_str_radix_10.rs:31:5
| |
LL | u8::from_str_radix("7", 10)?; LL | u8::from_str_radix("7", 10)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `("7").parse()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `"7".parse::<u8>()`
error: this call to `from_str_radix` can be replaced with a call to `str::parse` error: this call to `from_str_radix` can be replaced with a call to `str::parse`
--> $DIR/from_str_radix_10.rs:23:5 --> $DIR/from_str_radix_10.rs:32:5
|
LL | u16::from_str_radix(&("10".to_owned() + "5"), 10)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(&("10".to_owned() + "5")).parse::<u16>()`
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
--> $DIR/from_str_radix_10.rs:33:5
|
LL | i128::from_str_radix(Test + Test, 10)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(Test + Test).parse::<i128>()`
error: this call to `from_str_radix` can be replaced with a call to `str::parse`
--> $DIR/from_str_radix_10.rs:36:5
| |
LL | i32::from_str_radix(string, 10)?; LL | i32::from_str_radix(string, 10)?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(string).parse()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `string.parse::<i32>()`
error: aborting due to 5 previous errors error: aborting due to 7 previous errors