@@ -93,6 +93,7 @@ mod unnecessary_fold;
93
93
mod unnecessary_iter_cloned;
94
94
mod unnecessary_join;
95
95
mod unnecessary_lazy_eval;
96
+ mod unnecessary_literal_unwrap;
96
97
mod unnecessary_sort_by;
97
98
mod unnecessary_to_owned;
98
99
mod unwrap_or_else_default;
@@ -273,6 +274,32 @@ declare_clippy_lint! {
273
274
"using `.unwrap()` on `Result` or `Option`, which should at least get a better message using `expect()`"
274
275
}
275
276
277
+ declare_clippy_lint ! {
278
+ /// ### What it does
279
+ /// Checks for `.unwrap()` related calls on `Result`s and `Option`s that are constructed.
280
+ ///
281
+ /// ### Why is this bad?
282
+ /// It is better to write the value directly without the indirection.
283
+ ///
284
+ /// ### Examples
285
+ /// ```rust
286
+ /// let val1 = Some(1).unwrap();
287
+ /// let val2 = Ok::<_, ()>(1).unwrap();
288
+ /// let val3 = Err::<(), _>(1).unwrap_err();
289
+ /// ```
290
+ ///
291
+ /// Use instead:
292
+ /// ```rust
293
+ /// let val1 = 1;
294
+ /// let val2 = 1;
295
+ /// let val3 = 1;
296
+ /// ```
297
+ #[ clippy:: version = "1.69.0" ]
298
+ pub UNNECESSARY_LITERAL_UNWRAP ,
299
+ complexity,
300
+ "using `unwrap()` related calls on `Result` and `Option` constructors"
301
+ }
302
+
276
303
declare_clippy_lint ! {
277
304
/// ### What it does
278
305
/// Checks for `.expect()` or `.expect_err()` calls on `Result`s and `.expect()` call on `Option`s.
@@ -3349,6 +3376,7 @@ impl_lint_pass!(Methods => [
3349
3376
SUSPICIOUS_COMMAND_ARG_SPACE ,
3350
3377
CLEAR_WITH_DRAIN ,
3351
3378
MANUAL_NEXT_BACK ,
3379
+ UNNECESSARY_LITERAL_UNWRAP ,
3352
3380
] ) ;
3353
3381
3354
3382
/// Extracts a method call name, args, and `Span` of the method name.
@@ -3606,12 +3634,18 @@ impl Methods {
3606
3634
case_sensitive_file_extension_comparisons:: check ( cx, expr, span, recv, arg) ;
3607
3635
}
3608
3636
} ,
3609
- ( "expect" , [ _] ) => match method_call ( recv) {
3610
- Some ( ( "ok" , recv, [ ] , _, _) ) => ok_expect:: check ( cx, expr, recv) ,
3611
- Some ( ( "err" , recv, [ ] , err_span, _) ) => err_expect:: check ( cx, expr, recv, span, err_span, & self . msrv ) ,
3612
- _ => expect_used:: check ( cx, expr, recv, false , self . allow_expect_in_tests ) ,
3637
+ ( "expect" , [ _] ) => {
3638
+ match method_call ( recv) {
3639
+ Some ( ( "ok" , recv, [ ] , _, _) ) => ok_expect:: check ( cx, expr, recv) ,
3640
+ Some ( ( "err" , recv, [ ] , err_span, _) ) => err_expect:: check ( cx, expr, recv, span, err_span, & self . msrv ) ,
3641
+ _ => expect_used:: check ( cx, expr, recv, false , self . allow_expect_in_tests ) ,
3642
+ }
3643
+ unnecessary_literal_unwrap:: check ( cx, expr, recv, name, args) ;
3644
+ } ,
3645
+ ( "expect_err" , [ _] ) => {
3646
+ unnecessary_literal_unwrap:: check ( cx, expr, recv, name, args) ;
3647
+ expect_used:: check ( cx, expr, recv, true , self . allow_expect_in_tests ) ;
3613
3648
} ,
3614
- ( "expect_err" , [ _] ) => expect_used:: check ( cx, expr, recv, true , self . allow_expect_in_tests ) ,
3615
3649
( "extend" , [ arg] ) => {
3616
3650
string_extend_chars:: check ( cx, expr, recv, arg) ;
3617
3651
extend_with_drain:: check ( cx, expr, recv, arg) ;
@@ -3816,28 +3850,41 @@ impl Methods {
3816
3850
} ,
3817
3851
_ => { } ,
3818
3852
}
3853
+ unnecessary_literal_unwrap:: check ( cx, expr, recv, name, args) ;
3819
3854
unwrap_used:: check ( cx, expr, recv, false , self . allow_unwrap_in_tests ) ;
3820
3855
} ,
3821
- ( "unwrap_err" , [ ] ) => unwrap_used:: check ( cx, expr, recv, true , self . allow_unwrap_in_tests ) ,
3822
- ( "unwrap_or" , [ u_arg] ) => match method_call ( recv) {
3823
- Some ( ( arith @ ( "checked_add" | "checked_sub" | "checked_mul" ) , lhs, [ rhs] , _, _) ) => {
3824
- manual_saturating_arithmetic:: check ( cx, expr, lhs, rhs, u_arg, & arith[ "checked_" . len ( ) ..] ) ;
3825
- } ,
3826
- Some ( ( "map" , m_recv, [ m_arg] , span, _) ) => {
3827
- option_map_unwrap_or:: check ( cx, expr, m_recv, m_arg, recv, u_arg, span) ;
3828
- } ,
3829
- Some ( ( "then_some" , t_recv, [ t_arg] , _, _) ) => {
3830
- obfuscated_if_else:: check ( cx, expr, t_recv, t_arg, u_arg) ;
3831
- } ,
3832
- _ => { } ,
3856
+ ( "unwrap_err" , [ ] ) => {
3857
+ unnecessary_literal_unwrap:: check ( cx, expr, recv, name, args) ;
3858
+ unwrap_used:: check ( cx, expr, recv, true , self . allow_unwrap_in_tests ) ;
3833
3859
} ,
3834
- ( "unwrap_or_else" , [ u_arg] ) => match method_call ( recv) {
3835
- Some ( ( "map" , recv, [ map_arg] , _, _) )
3836
- if map_unwrap_or:: check ( cx, expr, recv, map_arg, u_arg, & self . msrv ) => { } ,
3837
- _ => {
3838
- unwrap_or_else_default:: check ( cx, expr, recv, u_arg) ;
3839
- unnecessary_lazy_eval:: check ( cx, expr, recv, u_arg, "unwrap_or" ) ;
3840
- } ,
3860
+ ( "unwrap_or" , [ u_arg] ) => {
3861
+ match method_call ( recv) {
3862
+ Some ( ( arith @ ( "checked_add" | "checked_sub" | "checked_mul" ) , lhs, [ rhs] , _, _) ) => {
3863
+ manual_saturating_arithmetic:: check ( cx, expr, lhs, rhs, u_arg, & arith[ "checked_" . len ( ) ..] ) ;
3864
+ } ,
3865
+ Some ( ( "map" , m_recv, [ m_arg] , span, _) ) => {
3866
+ option_map_unwrap_or:: check ( cx, expr, m_recv, m_arg, recv, u_arg, span) ;
3867
+ } ,
3868
+ Some ( ( "then_some" , t_recv, [ t_arg] , _, _) ) => {
3869
+ obfuscated_if_else:: check ( cx, expr, t_recv, t_arg, u_arg) ;
3870
+ } ,
3871
+ _ => { } ,
3872
+ }
3873
+ unnecessary_literal_unwrap:: check ( cx, expr, recv, name, args) ;
3874
+ } ,
3875
+ ( "unwrap_or_default" , [ ] ) => {
3876
+ unnecessary_literal_unwrap:: check ( cx, expr, recv, name, args) ;
3877
+ }
3878
+ ( "unwrap_or_else" , [ u_arg] ) => {
3879
+ match method_call ( recv) {
3880
+ Some ( ( "map" , recv, [ map_arg] , _, _) )
3881
+ if map_unwrap_or:: check ( cx, expr, recv, map_arg, u_arg, & self . msrv ) => { } ,
3882
+ _ => {
3883
+ unwrap_or_else_default:: check ( cx, expr, recv, u_arg) ;
3884
+ unnecessary_lazy_eval:: check ( cx, expr, recv, u_arg, "unwrap_or" ) ;
3885
+ } ,
3886
+ }
3887
+ unnecessary_literal_unwrap:: check ( cx, expr, recv, name, args) ;
3841
3888
} ,
3842
3889
( "zip" , [ arg] ) => {
3843
3890
if let ExprKind :: MethodCall ( name, iter_recv, [ ] , _) = recv. kind
0 commit comments