@@ -556,6 +556,7 @@ trait UnusedDelimLint {
556
556
followed_by_block : bool ,
557
557
left_pos : Option < BytePos > ,
558
558
right_pos : Option < BytePos > ,
559
+ is_kw : bool ,
559
560
) ;
560
561
561
562
fn is_expr_delims_necessary (
@@ -624,6 +625,7 @@ trait UnusedDelimLint {
624
625
ctx : UnusedDelimsCtx ,
625
626
left_pos : Option < BytePos > ,
626
627
right_pos : Option < BytePos > ,
628
+ is_kw : bool ,
627
629
) {
628
630
// If `value` has `ExprKind::Err`, unused delim lint can be broken.
629
631
// For example, the following code caused ICE.
@@ -667,7 +669,7 @@ trait UnusedDelimLint {
667
669
left_pos. is_some_and ( |s| s >= value. span . lo ( ) ) ,
668
670
right_pos. is_some_and ( |s| s <= value. span . hi ( ) ) ,
669
671
) ;
670
- self . emit_unused_delims ( cx, value. span , spans, ctx. into ( ) , keep_space) ;
672
+ self . emit_unused_delims ( cx, value. span , spans, ctx. into ( ) , keep_space, is_kw ) ;
671
673
}
672
674
673
675
fn emit_unused_delims (
@@ -677,6 +679,7 @@ trait UnusedDelimLint {
677
679
spans : Option < ( Span , Span ) > ,
678
680
msg : & str ,
679
681
keep_space : ( bool , bool ) ,
682
+ is_kw : bool ,
680
683
) {
681
684
let primary_span = if let Some ( ( lo, hi) ) = spans {
682
685
if hi. is_empty ( ) {
@@ -690,7 +693,7 @@ trait UnusedDelimLint {
690
693
let suggestion = spans. map ( |( lo, hi) | {
691
694
let sm = cx. sess ( ) . source_map ( ) ;
692
695
let lo_replace =
693
- if keep_space. 0 &&
696
+ if ( keep_space. 0 || is_kw ) &&
694
697
let Ok ( snip) = sm. span_to_prev_source ( lo) && !snip. ends_with ( ' ' ) {
695
698
" "
696
699
} else {
@@ -720,15 +723,15 @@ trait UnusedDelimLint {
720
723
721
724
fn check_expr ( & mut self , cx : & EarlyContext < ' _ > , e : & ast:: Expr ) {
722
725
use rustc_ast:: ExprKind :: * ;
723
- let ( value, ctx, followed_by_block, left_pos, right_pos) = match e. kind {
726
+ let ( value, ctx, followed_by_block, left_pos, right_pos, is_kw ) = match e. kind {
724
727
// Do not lint `unused_braces` in `if let` expressions.
725
728
If ( ref cond, ref block, _)
726
729
if !matches ! ( cond. kind, Let ( _, _, _) )
727
730
|| Self :: LINT_EXPR_IN_PATTERN_MATCHING_CTX =>
728
731
{
729
732
let left = e. span . lo ( ) + rustc_span:: BytePos ( 2 ) ;
730
733
let right = block. span . lo ( ) ;
731
- ( cond, UnusedDelimsCtx :: IfCond , true , Some ( left) , Some ( right) )
734
+ ( cond, UnusedDelimsCtx :: IfCond , true , Some ( left) , Some ( right) , true )
732
735
}
733
736
734
737
// Do not lint `unused_braces` in `while let` expressions.
@@ -738,27 +741,27 @@ trait UnusedDelimLint {
738
741
{
739
742
let left = e. span . lo ( ) + rustc_span:: BytePos ( 5 ) ;
740
743
let right = block. span . lo ( ) ;
741
- ( cond, UnusedDelimsCtx :: WhileCond , true , Some ( left) , Some ( right) )
744
+ ( cond, UnusedDelimsCtx :: WhileCond , true , Some ( left) , Some ( right) , true )
742
745
}
743
746
744
747
ForLoop ( _, ref cond, ref block, ..) => {
745
- ( cond, UnusedDelimsCtx :: ForIterExpr , true , None , Some ( block. span . lo ( ) ) )
748
+ ( cond, UnusedDelimsCtx :: ForIterExpr , true , None , Some ( block. span . lo ( ) ) , true )
746
749
}
747
750
748
751
Match ( ref head, _) if Self :: LINT_EXPR_IN_PATTERN_MATCHING_CTX => {
749
752
let left = e. span . lo ( ) + rustc_span:: BytePos ( 5 ) ;
750
- ( head, UnusedDelimsCtx :: MatchScrutineeExpr , true , Some ( left) , None )
753
+ ( head, UnusedDelimsCtx :: MatchScrutineeExpr , true , Some ( left) , None , true )
751
754
}
752
755
753
756
Ret ( Some ( ref value) ) => {
754
757
let left = e. span . lo ( ) + rustc_span:: BytePos ( 3 ) ;
755
- ( value, UnusedDelimsCtx :: ReturnValue , false , Some ( left) , None )
758
+ ( value, UnusedDelimsCtx :: ReturnValue , false , Some ( left) , None , true )
756
759
}
757
760
758
- Index ( _, ref value) => ( value, UnusedDelimsCtx :: IndexExpr , false , None , None ) ,
761
+ Index ( _, ref value) => ( value, UnusedDelimsCtx :: IndexExpr , false , None , None , false ) ,
759
762
760
763
Assign ( _, ref value, _) | AssignOp ( .., ref value) => {
761
- ( value, UnusedDelimsCtx :: AssignedValue , false , None , None )
764
+ ( value, UnusedDelimsCtx :: AssignedValue , false , None , None , false )
762
765
}
763
766
// either function/method call, or something this lint doesn't care about
764
767
ref call_or_other => {
@@ -778,12 +781,20 @@ trait UnusedDelimLint {
778
781
return ;
779
782
}
780
783
for arg in args_to_check {
781
- self . check_unused_delims_expr ( cx, arg, ctx, false , None , None ) ;
784
+ self . check_unused_delims_expr ( cx, arg, ctx, false , None , None , false ) ;
782
785
}
783
786
return ;
784
787
}
785
788
} ;
786
- self . check_unused_delims_expr ( cx, & value, ctx, followed_by_block, left_pos, right_pos) ;
789
+ self . check_unused_delims_expr (
790
+ cx,
791
+ & value,
792
+ ctx,
793
+ followed_by_block,
794
+ left_pos,
795
+ right_pos,
796
+ is_kw,
797
+ ) ;
787
798
}
788
799
789
800
fn check_stmt ( & mut self , cx : & EarlyContext < ' _ > , s : & ast:: Stmt ) {
@@ -794,7 +805,7 @@ trait UnusedDelimLint {
794
805
None => UnusedDelimsCtx :: AssignedValue ,
795
806
Some ( _) => UnusedDelimsCtx :: AssignedValueLetElse ,
796
807
} ;
797
- self . check_unused_delims_expr ( cx, init, ctx, false , None , None ) ;
808
+ self . check_unused_delims_expr ( cx, init, ctx, false , None , None , false ) ;
798
809
}
799
810
}
800
811
StmtKind :: Expr ( ref expr) => {
@@ -805,6 +816,7 @@ trait UnusedDelimLint {
805
816
false ,
806
817
None ,
807
818
None ,
819
+ false ,
808
820
) ;
809
821
}
810
822
_ => { }
@@ -824,6 +836,7 @@ trait UnusedDelimLint {
824
836
false ,
825
837
None ,
826
838
None ,
839
+ false ,
827
840
) ;
828
841
}
829
842
}
@@ -879,6 +892,7 @@ impl UnusedDelimLint for UnusedParens {
879
892
followed_by_block : bool ,
880
893
left_pos : Option < BytePos > ,
881
894
right_pos : Option < BytePos > ,
895
+ is_kw : bool ,
882
896
) {
883
897
match value. kind {
884
898
ast:: ExprKind :: Paren ( ref inner) => {
@@ -893,7 +907,7 @@ impl UnusedDelimLint for UnusedParens {
893
907
_,
894
908
) if node. lazy( ) ) )
895
909
{
896
- self . emit_unused_delims_expr ( cx, value, ctx, left_pos, right_pos)
910
+ self . emit_unused_delims_expr ( cx, value, ctx, left_pos, right_pos, is_kw )
897
911
}
898
912
}
899
913
ast:: ExprKind :: Let ( _, ref expr, _) => {
@@ -904,6 +918,7 @@ impl UnusedDelimLint for UnusedParens {
904
918
followed_by_block,
905
919
None ,
906
920
None ,
921
+ false ,
907
922
) ;
908
923
}
909
924
_ => { }
@@ -942,7 +957,7 @@ impl UnusedParens {
942
957
. span
943
958
. find_ancestor_inside ( value. span )
944
959
. map ( |inner| ( value. span . with_hi ( inner. lo ( ) ) , value. span . with_lo ( inner. hi ( ) ) ) ) ;
945
- self . emit_unused_delims ( cx, value. span , spans, "pattern" , keep_space) ;
960
+ self . emit_unused_delims ( cx, value. span , spans, "pattern" , keep_space, false ) ;
946
961
}
947
962
}
948
963
}
@@ -967,6 +982,7 @@ impl EarlyLintPass for UnusedParens {
967
982
true ,
968
983
None ,
969
984
None ,
985
+ true ,
970
986
) ;
971
987
for stmt in & block. stmts {
972
988
<Self as UnusedDelimLint >:: check_stmt ( self , cx, stmt) ;
@@ -985,6 +1001,7 @@ impl EarlyLintPass for UnusedParens {
985
1001
false ,
986
1002
None ,
987
1003
None ,
1004
+ true ,
988
1005
) ;
989
1006
}
990
1007
}
@@ -1043,6 +1060,7 @@ impl EarlyLintPass for UnusedParens {
1043
1060
false ,
1044
1061
None ,
1045
1062
None ,
1063
+ false ,
1046
1064
) ;
1047
1065
}
1048
1066
ast:: TyKind :: Paren ( r) => {
@@ -1057,7 +1075,7 @@ impl EarlyLintPass for UnusedParens {
1057
1075
. find_ancestor_inside ( ty. span )
1058
1076
. map ( |r| ( ty. span . with_hi ( r. lo ( ) ) , ty. span . with_lo ( r. hi ( ) ) ) ) ;
1059
1077
1060
- self . emit_unused_delims ( cx, ty. span , spans, "type" , ( false , false ) ) ;
1078
+ self . emit_unused_delims ( cx, ty. span , spans, "type" , ( false , false ) , false ) ;
1061
1079
}
1062
1080
}
1063
1081
self . with_self_ty_parens = false ;
@@ -1130,6 +1148,7 @@ impl UnusedDelimLint for UnusedBraces {
1130
1148
followed_by_block : bool ,
1131
1149
left_pos : Option < BytePos > ,
1132
1150
right_pos : Option < BytePos > ,
1151
+ is_kw : bool ,
1133
1152
) {
1134
1153
match value. kind {
1135
1154
ast:: ExprKind :: Block ( ref inner, None )
@@ -1170,7 +1189,7 @@ impl UnusedDelimLint for UnusedBraces {
1170
1189
&& !value. span . from_expansion ( )
1171
1190
&& !inner. span . from_expansion ( )
1172
1191
{
1173
- self . emit_unused_delims_expr ( cx, value, ctx, left_pos, right_pos)
1192
+ self . emit_unused_delims_expr ( cx, value, ctx, left_pos, right_pos, is_kw )
1174
1193
}
1175
1194
}
1176
1195
}
@@ -1183,6 +1202,7 @@ impl UnusedDelimLint for UnusedBraces {
1183
1202
followed_by_block,
1184
1203
None ,
1185
1204
None ,
1205
+ false ,
1186
1206
) ;
1187
1207
}
1188
1208
_ => { }
@@ -1207,6 +1227,7 @@ impl EarlyLintPass for UnusedBraces {
1207
1227
false ,
1208
1228
None ,
1209
1229
None ,
1230
+ false ,
1210
1231
) ;
1211
1232
}
1212
1233
}
@@ -1220,6 +1241,7 @@ impl EarlyLintPass for UnusedBraces {
1220
1241
false ,
1221
1242
None ,
1222
1243
None ,
1244
+ false ,
1223
1245
) ;
1224
1246
}
1225
1247
}
@@ -1233,6 +1255,7 @@ impl EarlyLintPass for UnusedBraces {
1233
1255
false ,
1234
1256
None ,
1235
1257
None ,
1258
+ false ,
1236
1259
) ;
1237
1260
}
1238
1261
}
@@ -1247,6 +1270,7 @@ impl EarlyLintPass for UnusedBraces {
1247
1270
false ,
1248
1271
None ,
1249
1272
None ,
1273
+ false ,
1250
1274
) ;
1251
1275
}
1252
1276
@@ -1258,6 +1282,7 @@ impl EarlyLintPass for UnusedBraces {
1258
1282
false ,
1259
1283
None ,
1260
1284
None ,
1285
+ false ,
1261
1286
) ;
1262
1287
}
1263
1288
0 commit comments