@@ -779,6 +779,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitArg {
779
779
780
780
match expr. kind {
781
781
ExprKind :: Call ( _, args) | ExprKind :: MethodCall ( _, _, args) => {
782
+ let mut args_to_recover = vec ! [ ] ;
782
783
for arg in args {
783
784
if is_unit ( cx. tables . expr_ty ( arg) ) && !is_unit_literal ( arg) {
784
785
if let ExprKind :: Match ( .., match_source) = & arg. kind {
@@ -787,17 +788,40 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitArg {
787
788
}
788
789
}
789
790
790
- span_lint_and_sugg (
791
- cx,
792
- UNIT_ARG ,
793
- arg. span ,
794
- "passing a unit value to a function" ,
795
- "if you intended to pass a unit value, use a unit literal instead" ,
796
- "()" . to_string ( ) ,
797
- Applicability :: MaybeIncorrect ,
798
- ) ;
791
+ args_to_recover. push ( arg) ;
799
792
}
800
793
}
794
+ if !args_to_recover. is_empty ( ) {
795
+ let mut applicability = Applicability :: MachineApplicable ;
796
+ span_lint_and_then ( cx, UNIT_ARG , expr. span , "passing a unit value to a function" , |db| {
797
+ db. span_suggestion (
798
+ expr. span . with_hi ( expr. span . lo ( ) ) ,
799
+ "move the expressions in front of the call..." ,
800
+ format ! (
801
+ "{} " ,
802
+ args_to_recover
803
+ . iter( )
804
+ . map( |arg| {
805
+ format!(
806
+ "{};" ,
807
+ snippet_with_applicability( cx, arg. span, ".." , & mut applicability)
808
+ )
809
+ } )
810
+ . collect:: <Vec <String >>( )
811
+ . join( " " )
812
+ ) ,
813
+ applicability,
814
+ ) ;
815
+ db. multipart_suggestion (
816
+ "...and use unit literals instead" ,
817
+ args_to_recover
818
+ . iter ( )
819
+ . map ( |arg| ( arg. span , "()" . to_string ( ) ) )
820
+ . collect :: < Vec < _ > > ( ) ,
821
+ applicability,
822
+ ) ;
823
+ } ) ;
824
+ }
801
825
} ,
802
826
_ => ( ) ,
803
827
}
0 commit comments