1515
1616use self :: SawExprComponent :: * ;
1717use self :: SawAbiComponent :: * ;
18+ use self :: SawItemComponent :: * ;
19+ use self :: SawPatComponent :: * ;
20+ use self :: SawTyComponent :: * ;
21+ use self :: SawTraitOrImplItemComponent :: * ;
22+ use syntax:: abi:: Abi ;
1823use syntax:: ast:: { self , Name , NodeId } ;
1924use syntax:: parse:: token;
2025use syntax_pos:: { Span , NO_EXPANSION , COMMAND_LINE_EXPN , BytePos } ;
@@ -155,19 +160,19 @@ enum SawAbiComponent<'a> {
155160
156161 SawMod ,
157162 SawForeignItem ,
158- SawItem ,
159- SawTy ,
163+ SawItem ( SawItemComponent ) ,
164+ SawTy ( SawTyComponent ) ,
160165 SawGenerics ,
161- SawTraitItem ,
162- SawImplItem ,
166+ SawTraitItem ( SawTraitOrImplItemComponent ) ,
167+ SawImplItem ( SawTraitOrImplItemComponent ) ,
163168 SawStructField ,
164169 SawVariant ,
165170 SawPath ( bool ) ,
166171 SawPathSegment ,
167172 SawPathParameters ,
168173 SawPathListItem ,
169174 SawBlock ,
170- SawPat ,
175+ SawPat ( SawPatComponent ) ,
171176 SawLocal ,
172177 SawArm ,
173178 SawExpr ( SawExprComponent < ' a > ) ,
@@ -198,6 +203,9 @@ enum SawAbiComponent<'a> {
198203/// because the SVH is just a developer convenience; there is no
199204/// guarantee of collision-freedom, hash collisions are just
200205/// (hopefully) unlikely.)
206+ ///
207+ /// The xxxComponent enums and saw_xxx functions for Item, Pat,
208+ /// Ty, TraitItem and ImplItem follow the same methodology.
201209#[ derive( Hash ) ]
202210enum SawExprComponent < ' a > {
203211
@@ -267,6 +275,134 @@ fn saw_expr<'a>(node: &'a Expr_) -> SawExprComponent<'a> {
267275 }
268276}
269277
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+
270406#[ derive( Clone , Copy , Hash , Eq , PartialEq ) ]
271407enum SawSpanExpnKind {
272408 NoExpansion ,
@@ -383,10 +519,7 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
383519
384520 fn visit_item ( & mut self , i : & ' tcx Item ) {
385521 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 ) ;
390523 hash_span ! ( self , i. span) ;
391524 hash_attrs ! ( self , & i. attrs) ;
392525 visit:: walk_item ( self , i)
@@ -399,7 +532,7 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
399532
400533 fn visit_ty ( & mut self , t : & ' tcx Ty ) {
401534 debug ! ( "visit_ty: st={:?}" , self . st) ;
402- SawTy . hash ( self . st ) ;
535+ SawTy ( saw_ty ( & t . node ) ) . hash ( self . st ) ;
403536 hash_span ! ( self , t. span) ;
404537 visit:: walk_ty ( self , t)
405538 }
@@ -412,17 +545,15 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
412545
413546 fn visit_trait_item ( & mut self , ti : & ' tcx TraitItem ) {
414547 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 ) ;
417549 hash_span ! ( self , ti. span) ;
418550 hash_attrs ! ( self , & ti. attrs) ;
419551 visit:: walk_trait_item ( self , ti)
420552 }
421553
422554 fn visit_impl_item ( & mut self , ii : & ' tcx ImplItem ) {
423555 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 ) ;
426557 hash_span ! ( self , ii. span) ;
427558 hash_attrs ! ( self , & ii. attrs) ;
428559 visit:: walk_impl_item ( self , ii)
@@ -452,8 +583,7 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
452583
453584 fn visit_pat ( & mut self , p : & ' tcx Pat ) {
454585 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 ) ;
457587 hash_span ! ( self , p. span) ;
458588 visit:: walk_pat ( self , p)
459589 }
0 commit comments