Adding handling and tests for custom type with implemented expect method

This commit is contained in:
Donald Robertson 2018-05-29 10:20:18 +02:00
parent fe8c9d5965
commit 1ead12c500
3 changed files with 63 additions and 37 deletions

View file

@ -1006,11 +1006,13 @@ fn lint_expect_fun_call(cx: &LateContext, expr: &hir::Expr, method_span: Span, n
return; return;
} }
let self_ty = cx.tables.expr_ty(self_expr); let self_type = cx.tables.expr_ty(self_expr);
let closure = match match_type(cx, self_ty, &paths::OPTION) { let known_types = &[&paths::OPTION, &paths::RESULT];
true => "||",
false => "|_|", // if not a known type, return early
}; if known_types.iter().all(|&k| !match_type(cx, self_type, k)) {
return;
}
// don't lint for constant values // don't lint for constant values
let owner_def = cx.tcx.hir.get_parent_did(arg.id); let owner_def = cx.tcx.hir.get_parent_did(arg.id);
@ -1019,6 +1021,11 @@ fn lint_expect_fun_call(cx: &LateContext, expr: &hir::Expr, method_span: Span, n
return; return;
} }
let closure = match match_type(cx, self_type, &paths::OPTION) {
true => "||",
false => "|_|",
};
let sugg: Cow<_> = snippet(cx, arg.span, ".."); let sugg: Cow<_> = snippet(cx, arg.span, "..");
let span_replace_word = method_span.with_hi(span.hi()); let span_replace_word = method_span.with_hi(span.hi());

View file

@ -344,6 +344,16 @@ fn or_fun_call() {
/// Checks implementation of the `EXPECT_FUN_CALL` lint /// Checks implementation of the `EXPECT_FUN_CALL` lint
fn expect_fun_call() { fn expect_fun_call() {
struct Foo;
impl Foo {
fn new() -> Self { Foo }
fn expect(&self, msg: &str) {
panic!("{}", msg)
}
}
let with_some = Some("value"); let with_some = Some("value");
with_some.expect("error"); with_some.expect("error");
@ -369,6 +379,15 @@ fn expect_fun_call() {
let with_err_and_as_str: Result<(), ()> = Err(()); let with_err_and_as_str: Result<(), ()> = Err(());
with_err_and_as_str.expect(format!("Error {}: fake error", error_code).as_str()); with_err_and_as_str.expect(format!("Error {}: fake error", error_code).as_str());
let with_dummy_type = Foo::new();
with_dummy_type.expect("another test string");
let with_dummy_type_and_format = Foo::new();
with_dummy_type_and_format.expect(&format!("Error {}: fake error", error_code));
let with_dummy_type_and_as_str = Foo::new();
with_dummy_type_and_as_str.expect(format!("Error {}: fake error", error_code).as_str());
} }
/// Checks implementation of `ITER_NTH` lint /// Checks implementation of `ITER_NTH` lint

View file

@ -424,105 +424,105 @@ error: use of `unwrap_or` followed by a function call
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| "".to_owned())` | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| "".to_owned())`
error: use of `expect` followed by a function call error: use of `expect` followed by a function call
--> $DIR/methods.rs:355:26 --> $DIR/methods.rs:365:26
| |
355 | with_none_and_format.expect(&format!("Error {}: fake error", error_code)); 365 | with_none_and_format.expect(&format!("Error {}: fake error", error_code));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!(&format!("Error {}: fake error", error_code)))` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!(&format!("Error {}: fake error", error_code)))`
| |
= note: `-D expect-fun-call` implied by `-D warnings` = note: `-D expect-fun-call` implied by `-D warnings`
error: use of `expect` followed by a function call error: use of `expect` followed by a function call
--> $DIR/methods.rs:358:26 --> $DIR/methods.rs:368:26
| |
358 | with_none_and_as_str.expect(format!("Error {}: fake error", error_code).as_str()); 368 | with_none_and_as_str.expect(format!("Error {}: fake error", error_code).as_str());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!(format!("Error {}: fake error", error_code).as_str()))` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!(format!("Error {}: fake error", error_code).as_str()))`
error: use of `expect` followed by a function call error: use of `expect` followed by a function call
--> $DIR/methods.rs:368:25 --> $DIR/methods.rs:378:25
| |
368 | with_err_and_format.expect(&format!("Error {}: fake error", error_code)); 378 | with_err_and_format.expect(&format!("Error {}: fake error", error_code));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!(&format!("Error {}: fake error", error_code)))` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!(&format!("Error {}: fake error", error_code)))`
error: use of `expect` followed by a function call error: use of `expect` followed by a function call
--> $DIR/methods.rs:371:25 --> $DIR/methods.rs:381:25
| |
371 | with_err_and_as_str.expect(format!("Error {}: fake error", error_code).as_str()); 381 | with_err_and_as_str.expect(format!("Error {}: fake error", error_code).as_str());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!(format!("Error {}: fake error", error_code).as_str()))` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!(format!("Error {}: fake error", error_code).as_str()))`
error: called `.iter().nth()` on a Vec. Calling `.get()` is both faster and more readable error: called `.iter().nth()` on a Vec. Calling `.get()` is both faster and more readable
--> $DIR/methods.rs:382:23 --> $DIR/methods.rs:401:23
| |
382 | let bad_vec = some_vec.iter().nth(3); 401 | let bad_vec = some_vec.iter().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^
| |
= note: `-D iter-nth` implied by `-D warnings` = note: `-D iter-nth` implied by `-D warnings`
error: called `.iter().nth()` on a slice. Calling `.get()` is both faster and more readable error: called `.iter().nth()` on a slice. Calling `.get()` is both faster and more readable
--> $DIR/methods.rs:383:26 --> $DIR/methods.rs:402:26
| |
383 | let bad_slice = &some_vec[..].iter().nth(3); 402 | let bad_slice = &some_vec[..].iter().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter().nth()` on a slice. Calling `.get()` is both faster and more readable error: called `.iter().nth()` on a slice. Calling `.get()` is both faster and more readable
--> $DIR/methods.rs:384:31 --> $DIR/methods.rs:403:31
| |
384 | let bad_boxed_slice = boxed_slice.iter().nth(3); 403 | let bad_boxed_slice = boxed_slice.iter().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter().nth()` on a VecDeque. Calling `.get()` is both faster and more readable error: called `.iter().nth()` on a VecDeque. Calling `.get()` is both faster and more readable
--> $DIR/methods.rs:385:29 --> $DIR/methods.rs:404:29
| |
385 | let bad_vec_deque = some_vec_deque.iter().nth(3); 404 | let bad_vec_deque = some_vec_deque.iter().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter_mut().nth()` on a Vec. Calling `.get_mut()` is both faster and more readable error: called `.iter_mut().nth()` on a Vec. Calling `.get_mut()` is both faster and more readable
--> $DIR/methods.rs:390:23 --> $DIR/methods.rs:409:23
| |
390 | let bad_vec = some_vec.iter_mut().nth(3); 409 | let bad_vec = some_vec.iter_mut().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter_mut().nth()` on a slice. Calling `.get_mut()` is both faster and more readable error: called `.iter_mut().nth()` on a slice. Calling `.get_mut()` is both faster and more readable
--> $DIR/methods.rs:393:26 --> $DIR/methods.rs:412:26
| |
393 | let bad_slice = &some_vec[..].iter_mut().nth(3); 412 | let bad_slice = &some_vec[..].iter_mut().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter_mut().nth()` on a VecDeque. Calling `.get_mut()` is both faster and more readable error: called `.iter_mut().nth()` on a VecDeque. Calling `.get_mut()` is both faster and more readable
--> $DIR/methods.rs:396:29 --> $DIR/methods.rs:415:29
| |
396 | let bad_vec_deque = some_vec_deque.iter_mut().nth(3); 415 | let bad_vec_deque = some_vec_deque.iter_mut().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)`
--> $DIR/methods.rs:408:13 --> $DIR/methods.rs:427:13
| |
408 | let _ = some_vec.iter().skip(42).next(); 427 | let _ = some_vec.iter().skip(42).next();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
= note: `-D iter-skip-next` implied by `-D warnings` = note: `-D iter-skip-next` implied by `-D warnings`
error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)`
--> $DIR/methods.rs:409:13 --> $DIR/methods.rs:428:13
| |
409 | let _ = some_vec.iter().cycle().skip(42).next(); 428 | let _ = some_vec.iter().cycle().skip(42).next();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)`
--> $DIR/methods.rs:410:13 --> $DIR/methods.rs:429:13
| |
410 | let _ = (1..10).skip(10).next(); 429 | let _ = (1..10).skip(10).next();
| ^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^
error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)`
--> $DIR/methods.rs:411:14 --> $DIR/methods.rs:430:14
| |
411 | let _ = &some_vec[..].iter().skip(3).next(); 430 | let _ = &some_vec[..].iter().skip(3).next();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: used unwrap() on an Option value. If you don't want to handle the None case gracefully, consider using expect() to provide a better panic message error: used unwrap() on an Option value. If you don't want to handle the None case gracefully, consider using expect() to provide a better panic message
--> $DIR/methods.rs:420:13 --> $DIR/methods.rs:439:13
| |
420 | let _ = opt.unwrap(); 439 | let _ = opt.unwrap();
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
| |
= note: `-D option-unwrap-used` implied by `-D warnings` = note: `-D option-unwrap-used` implied by `-D warnings`