15
15
16
16
use self :: SawExprComponent :: * ;
17
17
use self :: SawAbiComponent :: * ;
18
+ use self :: SawItemComponent :: * ;
19
+ use self :: SawPatComponent :: * ;
20
+ use self :: SawTyComponent :: * ;
21
+ use self :: SawTraitOrImplItemComponent :: * ;
22
+ use syntax:: abi:: Abi ;
18
23
use syntax:: ast:: { self , Name , NodeId } ;
19
24
use syntax:: parse:: token;
20
25
use syntax_pos:: { Span , NO_EXPANSION , COMMAND_LINE_EXPN , BytePos } ;
@@ -155,19 +160,19 @@ enum SawAbiComponent<'a> {
155
160
156
161
SawMod ,
157
162
SawForeignItem ,
158
- SawItem ,
159
- SawTy ,
163
+ SawItem ( SawItemComponent ) ,
164
+ SawTy ( SawTyComponent ) ,
160
165
SawGenerics ,
161
- SawTraitItem ,
162
- SawImplItem ,
166
+ SawTraitItem ( SawTraitOrImplItemComponent ) ,
167
+ SawImplItem ( SawTraitOrImplItemComponent ) ,
163
168
SawStructField ,
164
169
SawVariant ,
165
170
SawPath ( bool ) ,
166
171
SawPathSegment ,
167
172
SawPathParameters ,
168
173
SawPathListItem ,
169
174
SawBlock ,
170
- SawPat ,
175
+ SawPat ( SawPatComponent ) ,
171
176
SawLocal ,
172
177
SawArm ,
173
178
SawExpr ( SawExprComponent < ' a > ) ,
@@ -198,6 +203,9 @@ enum SawAbiComponent<'a> {
198
203
/// because the SVH is just a developer convenience; there is no
199
204
/// guarantee of collision-freedom, hash collisions are just
200
205
/// (hopefully) unlikely.)
206
+ ///
207
+ /// The xxxComponent enums and saw_xxx functions for Item, Pat,
208
+ /// Ty, TraitItem and ImplItem follow the same methodology.
201
209
#[ derive( Hash ) ]
202
210
enum SawExprComponent < ' a > {
203
211
@@ -267,6 +275,134 @@ fn saw_expr<'a>(node: &'a Expr_) -> SawExprComponent<'a> {
267
275
}
268
276
}
269
277
278
+ #[ derive( Hash ) ]
279
+ enum SawItemComponent {
280
+ SawItemExternCrate ,
281
+ SawItemUse ,
282
+ SawItemStatic ( Mutability ) ,
283
+ SawItemConst ,
284
+ SawItemFn ( Unsafety , Constness , Abi ) ,
285
+ SawItemMod ,
286
+ SawItemForeignMod ,
287
+ SawItemTy ,
288
+ SawItemEnum ,
289
+ SawItemStruct ,
290
+ SawItemUnion ,
291
+ SawItemTrait ( Unsafety ) ,
292
+ SawItemDefaultImpl ( Unsafety ) ,
293
+ SawItemImpl ( Unsafety , ImplPolarity )
294
+ }
295
+
296
+ fn saw_item ( node : & Item_ ) -> SawItemComponent {
297
+ match * node {
298
+ ItemExternCrate ( ..) => SawItemExternCrate ,
299
+ ItemUse ( ..) => SawItemUse ,
300
+ ItemStatic ( _, mutability, _) => SawItemStatic ( mutability) ,
301
+ ItemConst ( ..) =>SawItemConst ,
302
+ ItemFn ( _, unsafety, constness, abi, _, _) => SawItemFn ( unsafety, constness, abi) ,
303
+ ItemMod ( ..) => SawItemMod ,
304
+ ItemForeignMod ( ..) => SawItemForeignMod ,
305
+ ItemTy ( ..) => SawItemTy ,
306
+ ItemEnum ( ..) => SawItemEnum ,
307
+ ItemStruct ( ..) => SawItemStruct ,
308
+ ItemUnion ( ..) => SawItemUnion ,
309
+ ItemTrait ( unsafety, ..) => SawItemTrait ( unsafety) ,
310
+ ItemDefaultImpl ( unsafety, _) => SawItemDefaultImpl ( unsafety) ,
311
+ ItemImpl ( unsafety, implpolarity, ..) => SawItemImpl ( unsafety, implpolarity)
312
+ }
313
+ }
314
+
315
+ #[ derive( Hash ) ]
316
+ enum SawPatComponent {
317
+ SawPatWild ,
318
+ SawPatBinding ( BindingMode ) ,
319
+ SawPatStruct ,
320
+ SawPatTupleStruct ,
321
+ SawPatPath ,
322
+ SawPatTuple ,
323
+ SawPatBox ,
324
+ SawPatRef ( Mutability ) ,
325
+ SawPatLit ,
326
+ SawPatRange ,
327
+ SawPatSlice
328
+ }
329
+
330
+ fn saw_pat ( node : & PatKind ) -> SawPatComponent {
331
+ match * node {
332
+ PatKind :: Wild => SawPatWild ,
333
+ PatKind :: Binding ( bindingmode, ..) => SawPatBinding ( bindingmode) ,
334
+ PatKind :: Struct ( ..) => SawPatStruct ,
335
+ PatKind :: TupleStruct ( ..) => SawPatTupleStruct ,
336
+ PatKind :: Path ( ..) => SawPatPath ,
337
+ PatKind :: Tuple ( ..) => SawPatTuple ,
338
+ PatKind :: Box ( ..) => SawPatBox ,
339
+ PatKind :: Ref ( _, mutability) => SawPatRef ( mutability) ,
340
+ PatKind :: Lit ( ..) => SawPatLit ,
341
+ PatKind :: Range ( ..) => SawPatRange ,
342
+ PatKind :: Slice ( ..) => SawPatSlice
343
+ }
344
+ }
345
+
346
+ #[ derive( Hash ) ]
347
+ enum SawTyComponent {
348
+ SawTySlice ,
349
+ SawTyArray ,
350
+ SawTyPtr ( Mutability ) ,
351
+ SawTyRptr ( Mutability ) ,
352
+ SawTyBareFn ( Unsafety , Abi ) ,
353
+ SawTyNever ,
354
+ SawTyTup ,
355
+ SawTyPath ,
356
+ SawTyObjectSum ,
357
+ SawTyPolyTraitRef ,
358
+ SawTyImplTrait ,
359
+ SawTyTypeof ,
360
+ SawTyInfer
361
+ }
362
+
363
+ fn saw_ty ( node : & Ty_ ) -> SawTyComponent {
364
+ match * node {
365
+ TySlice ( ..) => SawTySlice ,
366
+ TyArray ( ..) => SawTyArray ,
367
+ TyPtr ( ref mty) => SawTyPtr ( mty. mutbl ) ,
368
+ TyRptr ( _, ref mty) => SawTyRptr ( mty. mutbl ) ,
369
+ TyBareFn ( ref barefnty) => SawTyBareFn ( barefnty. unsafety , barefnty. abi ) ,
370
+ TyNever => SawTyNever ,
371
+ TyTup ( ..) => SawTyTup ,
372
+ TyPath ( ..) => SawTyPath ,
373
+ TyObjectSum ( ..) => SawTyObjectSum ,
374
+ TyPolyTraitRef ( ..) => SawTyPolyTraitRef ,
375
+ TyImplTrait ( ..) => SawTyImplTrait ,
376
+ TyTypeof ( ..) => SawTyTypeof ,
377
+ TyInfer => SawTyInfer
378
+ }
379
+ }
380
+
381
+ #[ derive( Hash ) ]
382
+ enum SawTraitOrImplItemComponent {
383
+ SawTraitOrImplItemConst ,
384
+ SawTraitOrImplItemMethod ( Unsafety , Constness , Abi ) ,
385
+ SawTraitOrImplItemType
386
+ }
387
+
388
+ fn saw_trait_item ( ti : & TraitItem_ ) -> SawTraitOrImplItemComponent {
389
+ match * ti {
390
+ ConstTraitItem ( ..) => SawTraitOrImplItemConst ,
391
+ MethodTraitItem ( ref sig, _) =>
392
+ SawTraitOrImplItemMethod ( sig. unsafety , sig. constness , sig. abi ) ,
393
+ TypeTraitItem ( ..) => SawTraitOrImplItemType
394
+ }
395
+ }
396
+
397
+ fn saw_impl_item ( ii : & ImplItemKind ) -> SawTraitOrImplItemComponent {
398
+ match * ii {
399
+ ImplItemKind :: Const ( ..) => SawTraitOrImplItemConst ,
400
+ ImplItemKind :: Method ( ref sig, _) =>
401
+ SawTraitOrImplItemMethod ( sig. unsafety , sig. constness , sig. abi ) ,
402
+ ImplItemKind :: Type ( ..) => SawTraitOrImplItemType
403
+ }
404
+ }
405
+
270
406
#[ derive( Clone , Copy , Hash , Eq , PartialEq ) ]
271
407
enum SawSpanExpnKind {
272
408
NoExpansion ,
@@ -383,10 +519,7 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
383
519
384
520
fn visit_item ( & mut self , i : & ' tcx Item ) {
385
521
debug ! ( "visit_item: {:?} st={:?}" , i, self . st) ;
386
-
387
- SawItem . hash ( self . st ) ;
388
- // Hash the value of the discriminant of the Item variant.
389
- self . hash_discriminant ( & i. node ) ;
522
+ SawItem ( saw_item ( & i. node ) ) . hash ( self . st ) ;
390
523
hash_span ! ( self , i. span) ;
391
524
hash_attrs ! ( self , & i. attrs) ;
392
525
visit:: walk_item ( self , i)
@@ -399,7 +532,7 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
399
532
400
533
fn visit_ty ( & mut self , t : & ' tcx Ty ) {
401
534
debug ! ( "visit_ty: st={:?}" , self . st) ;
402
- SawTy . hash ( self . st ) ;
535
+ SawTy ( saw_ty ( & t . node ) ) . hash ( self . st ) ;
403
536
hash_span ! ( self , t. span) ;
404
537
visit:: walk_ty ( self , t)
405
538
}
@@ -412,17 +545,15 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
412
545
413
546
fn visit_trait_item ( & mut self , ti : & ' tcx TraitItem ) {
414
547
debug ! ( "visit_trait_item: st={:?}" , self . st) ;
415
- SawTraitItem . hash ( self . st ) ;
416
- self . hash_discriminant ( & ti. node ) ;
548
+ SawTraitItem ( saw_trait_item ( & ti. node ) ) . hash ( self . st ) ;
417
549
hash_span ! ( self , ti. span) ;
418
550
hash_attrs ! ( self , & ti. attrs) ;
419
551
visit:: walk_trait_item ( self , ti)
420
552
}
421
553
422
554
fn visit_impl_item ( & mut self , ii : & ' tcx ImplItem ) {
423
555
debug ! ( "visit_impl_item: st={:?}" , self . st) ;
424
- SawImplItem . hash ( self . st ) ;
425
- self . hash_discriminant ( & ii. node ) ;
556
+ SawImplItem ( saw_impl_item ( & ii. node ) ) . hash ( self . st ) ;
426
557
hash_span ! ( self , ii. span) ;
427
558
hash_attrs ! ( self , & ii. attrs) ;
428
559
visit:: walk_impl_item ( self , ii)
@@ -452,8 +583,7 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
452
583
453
584
fn visit_pat ( & mut self , p : & ' tcx Pat ) {
454
585
debug ! ( "visit_pat: st={:?}" , self . st) ;
455
- SawPat . hash ( self . st ) ;
456
- self . hash_discriminant ( & p. node ) ;
586
+ SawPat ( saw_pat ( & p. node ) ) . hash ( self . st ) ;
457
587
hash_span ! ( self , p. span) ;
458
588
visit:: walk_pat ( self , p)
459
589
}
0 commit comments