@@ -3,7 +3,7 @@ use syntax::codemap::Span;
3
3
use syntax:: parse:: token:: InternedString ;
4
4
use syntax:: ast:: * ;
5
5
use syntax:: attr;
6
- use syntax:: visit;
6
+ use syntax:: visit:: { Visitor , walk_block , walk_pat , walk_expr } ;
7
7
use utils:: { span_lint_and_then, in_macro, span_lint} ;
8
8
9
9
/// **What it does:** This lint warns about names that are very similar and thus confusing
@@ -68,12 +68,17 @@ const WHITELIST: &'static [&'static [&'static str]] = &[
68
68
69
69
struct SimilarNamesNameVisitor < ' a , ' b : ' a , ' c : ' b > ( & ' a mut SimilarNamesLocalVisitor < ' b , ' c > ) ;
70
70
71
- impl < ' v , ' a , ' b , ' c > visit :: Visitor < ' v > for SimilarNamesNameVisitor < ' a , ' b , ' c > {
71
+ impl < ' v , ' a , ' b , ' c > Visitor < ' v > for SimilarNamesNameVisitor < ' a , ' b , ' c > {
72
72
fn visit_pat ( & mut self , pat : & ' v Pat ) {
73
- if let PatKind :: Ident ( _, id, _) = pat. node {
74
- self . check_name ( id. span , id. node . name ) ;
73
+ match pat. node {
74
+ PatKind :: Ident ( _, id, _) => self . check_name ( id. span , id. node . name ) ,
75
+ PatKind :: Struct ( _, ref fields, _) => for field in fields {
76
+ if !field. node . is_shorthand {
77
+ self . visit_pat ( & field. node . pat ) ;
78
+ }
79
+ } ,
80
+ _ => walk_pat ( self , pat) ,
75
81
}
76
- visit:: walk_pat ( self , pat) ;
77
82
}
78
83
}
79
84
@@ -219,22 +224,22 @@ impl<'a, 'b> SimilarNamesLocalVisitor<'a, 'b> {
219
224
}
220
225
}
221
226
222
- impl < ' v , ' a , ' b > visit :: Visitor < ' v > for SimilarNamesLocalVisitor < ' a , ' b > {
227
+ impl < ' v , ' a , ' b > Visitor < ' v > for SimilarNamesLocalVisitor < ' a , ' b > {
223
228
fn visit_local ( & mut self , local : & ' v Local ) {
224
229
if let Some ( ref init) = local. init {
225
- self . apply ( |this| visit :: walk_expr ( this, & * * init) ) ;
230
+ self . apply ( |this| walk_expr ( this, & * * init) ) ;
226
231
}
227
232
// add the pattern after the expression because the bindings aren't available yet in the init expression
228
233
SimilarNamesNameVisitor ( self ) . visit_pat ( & * local. pat ) ;
229
234
}
230
235
fn visit_block ( & mut self , blk : & ' v Block ) {
231
- self . apply ( |this| visit :: walk_block ( this, blk) ) ;
236
+ self . apply ( |this| walk_block ( this, blk) ) ;
232
237
}
233
238
fn visit_arm ( & mut self , arm : & ' v Arm ) {
234
239
self . apply ( |this| {
235
240
// just go through the first pattern, as either all patterns bind the same bindings or rustc would have errored much earlier
236
241
SimilarNamesNameVisitor ( this) . visit_pat ( & arm. pats [ 0 ] ) ;
237
- this. apply ( |this| visit :: walk_expr ( this, & arm. body ) ) ;
242
+ this. apply ( |this| walk_expr ( this, & arm. body ) ) ;
238
243
} ) ;
239
244
}
240
245
fn visit_item ( & mut self , _: & ' v Item ) {
@@ -254,10 +259,10 @@ impl EarlyLintPass for NonExpressiveNames {
254
259
} ;
255
260
// initialize with function arguments
256
261
for arg in & decl. inputs {
257
- visit :: walk_pat ( & mut SimilarNamesNameVisitor ( & mut visitor) , & arg. pat ) ;
262
+ SimilarNamesNameVisitor ( & mut visitor) . visit_pat ( & arg. pat ) ;
258
263
}
259
264
// walk all other bindings
260
- visit :: walk_block ( & mut visitor, blk) ;
265
+ walk_block ( & mut visitor, blk) ;
261
266
}
262
267
}
263
268
}
0 commit comments