@@ -47,60 +47,54 @@ declare_lint_pass!(RestWhenDestructuringStruct => [REST_WHEN_DESTRUCTURING_STRUC
47
47
48
48
impl < ' tcx > LateLintPass < ' tcx > for RestWhenDestructuringStruct {
49
49
fn check_pat ( & mut self , cx : & rustc_lint:: LateContext < ' tcx > , pat : & ' tcx rustc_hir:: Pat < ' tcx > ) {
50
- if pat. span . in_external_macro ( cx. tcx . sess . source_map ( ) ) {
51
- return ;
52
- }
53
-
54
- if is_from_proc_macro ( cx, pat) {
55
- return ;
56
- }
57
-
58
- if let rustc_hir:: PatKind :: Struct ( path, fields, true ) = pat. kind {
59
- let qty = cx. typeck_results ( ) . qpath_res ( & path, pat. hir_id ) ;
60
- let ty = cx. typeck_results ( ) . pat_ty ( pat) ;
61
- if let ty:: Adt ( a, _) = ty. kind ( ) {
62
- let vid = qty
63
- . opt_def_id ( )
64
- . map_or ( VariantIdx :: ZERO , |x| a. variant_index_with_id ( x) ) ;
65
- let mut rest_fields = a. variants ( ) [ vid]
66
- . fields
67
- . iter ( )
68
- . map ( |field| field. ident ( cx. tcx ) )
69
- . filter ( |pf| !fields. iter ( ) . any ( |x| x. ident == * pf) )
70
- . map ( |x| format ! ( "{x}: _" ) ) ;
71
- let fmt_fields = rest_fields. join ( ", " ) ;
50
+ if let rustc_hir:: PatKind :: Struct ( path, fields, true ) = pat. kind
51
+ && !pat. span . in_external_macro ( cx. tcx . sess . source_map ( ) )
52
+ && !is_from_proc_macro ( cx, pat)
53
+ && let qty = cx. typeck_results ( ) . qpath_res ( & path, pat. hir_id )
54
+ && let ty = cx. typeck_results ( ) . pat_ty ( pat)
55
+ && let ty:: Adt ( a, _) = ty. kind ( )
56
+ {
57
+ let vid = qty
58
+ . opt_def_id ( )
59
+ . map_or ( VariantIdx :: ZERO , |x| a. variant_index_with_id ( x) ) ;
60
+ let mut rest_fields = a. variants ( ) [ vid]
61
+ . fields
62
+ . iter ( )
63
+ . map ( |field| field. ident ( cx. tcx ) )
64
+ . filter ( |pf| !fields. iter ( ) . any ( |x| x. ident == * pf) )
65
+ . map ( |x| format ! ( "{x}: _" ) ) ;
66
+ let fmt_fields = rest_fields. join ( ", " ) ;
72
67
73
- let sm = cx. sess ( ) . source_map ( ) ;
68
+ let sm = cx. sess ( ) . source_map ( ) ;
74
69
75
- // It is not possible to get the span of the et cetera symbol at HIR level
76
- // so we have to get it in a bit of a roundabout way:
70
+ // It is not possible to get the span of the et cetera symbol at HIR level
71
+ // so we have to get it in a bit of a roundabout way:
77
72
78
- // Find the end of the last field if any.
79
- let last_field = fields. iter ( ) . last ( ) . map ( |x| x. span . shrink_to_hi ( ) ) ;
80
- // If no last field take the whole pattern.
81
- let last_field = last_field. unwrap_or ( pat. span . shrink_to_lo ( ) ) ;
82
- // Create a new span starting and ending just before the first .
83
- let before_dot = sm. span_extend_to_next_char ( last_field, '.' , true ) . shrink_to_hi ( ) ;
84
- // Extend the span to the end of the line
85
- let rest_of_line = sm. span_extend_to_next_char ( before_dot, '\n' , true ) ;
86
- // Shrink the span so it only contains dots
87
- let dotdot = sm. span_take_while ( rest_of_line, |x| * x == '.' ) ;
73
+ // Find the end of the last field if any.
74
+ let last_field = fields. iter ( ) . last ( ) . map ( |x| x. span . shrink_to_hi ( ) ) ;
75
+ // If no last field take the whole pattern.
76
+ let last_field = last_field. unwrap_or ( pat. span . shrink_to_lo ( ) ) ;
77
+ // Create a new span starting and ending just before the first .
78
+ let before_dot = sm. span_extend_to_next_char ( last_field, '.' , true ) . shrink_to_hi ( ) ;
79
+ // Extend the span to the end of the line
80
+ let rest_of_line = sm. span_extend_to_next_char ( before_dot, '\n' , true ) ;
81
+ // Shrink the span so it only contains dots
82
+ let dotdot = sm. span_take_while ( rest_of_line, |x| * x == '.' ) ;
88
83
89
- span_lint_and_then (
90
- cx,
91
- REST_WHEN_DESTRUCTURING_STRUCT ,
92
- pat. span ,
93
- "struct destructuring with rest (..)" ,
94
- |diag| {
95
- diag. span_suggestion_verbose (
96
- dotdot,
97
- "consider explicitly ignoring remaining fields with wildcard patterns (x: _)" ,
98
- fmt_fields,
99
- rustc_errors:: Applicability :: MachineApplicable ,
100
- ) ;
101
- } ,
102
- ) ;
103
- }
84
+ span_lint_and_then (
85
+ cx,
86
+ REST_WHEN_DESTRUCTURING_STRUCT ,
87
+ pat. span ,
88
+ "struct destructuring with rest (..)" ,
89
+ |diag| {
90
+ diag. span_suggestion_verbose (
91
+ dotdot,
92
+ "consider explicitly ignoring remaining fields with wildcard patterns (x: _)" ,
93
+ fmt_fields,
94
+ rustc_errors:: Applicability :: MachineApplicable ,
95
+ ) ;
96
+ } ,
97
+ ) ;
104
98
}
105
99
}
106
100
}
0 commit comments