@@ -7,9 +7,7 @@ use rustc_ast::ast::{self, Name, NodeId};
7
7
use rustc_data_structures:: svh:: Svh ;
8
8
use rustc_hir:: def:: { DefKind , Res } ;
9
9
use rustc_hir:: def_id:: { CrateNum , DefId , LocalDefId , LOCAL_CRATE } ;
10
- pub use rustc_hir:: definitions;
11
- pub use rustc_hir:: definitions:: { DefKey , DefPath , DefPathData , DefPathHash } ;
12
- pub use rustc_hir:: definitions:: { Definitions , DisambiguatedDefPathData } ;
10
+ use rustc_hir:: definitions:: { DefKey , DefPath , Definitions } ;
13
11
use rustc_hir:: intravisit;
14
12
use rustc_hir:: itemlikevisit:: ItemLikeVisitor ;
15
13
use rustc_hir:: print:: Nested ;
@@ -23,8 +21,6 @@ use rustc_target::spec::abi::Abi;
23
21
24
22
pub mod blocks;
25
23
mod collector;
26
- mod hir_id_validator;
27
- pub use hir_id_validator:: check_crate;
28
24
29
25
/// Represents an entry and its parent `HirId`.
30
26
#[ derive( Copy , Clone , Debug ) ]
@@ -44,79 +40,42 @@ impl<'hir> Entry<'hir> {
44
40
45
41
fn fn_decl < ' hir > ( node : Node < ' hir > ) -> Option < & ' hir FnDecl < ' hir > > {
46
42
match node {
47
- Node :: Item ( ref item) => match item. kind {
48
- ItemKind :: Fn ( ref sig, _, _) => Some ( & sig. decl ) ,
49
- _ => None ,
50
- } ,
51
-
52
- Node :: TraitItem ( ref item) => match item. kind {
53
- TraitItemKind :: Fn ( ref sig, _) => Some ( & sig. decl ) ,
54
- _ => None ,
55
- } ,
56
-
57
- Node :: ImplItem ( ref item) => match item. kind {
58
- ImplItemKind :: Fn ( ref sig, _) => Some ( & sig. decl ) ,
59
- _ => None ,
60
- } ,
61
-
62
- Node :: Expr ( ref expr) => match expr. kind {
63
- ExprKind :: Closure ( _, ref fn_decl, ..) => Some ( fn_decl) ,
64
- _ => None ,
65
- } ,
66
-
43
+ Node :: Item ( Item { kind : ItemKind :: Fn ( sig, _, _) , .. } )
44
+ | Node :: TraitItem ( TraitItem { kind : TraitItemKind :: Fn ( sig, _) , .. } )
45
+ | Node :: ImplItem ( ImplItem { kind : ImplItemKind :: Fn ( sig, _) , .. } ) => Some ( & sig. decl ) ,
46
+ Node :: Expr ( Expr { kind : ExprKind :: Closure ( _, fn_decl, ..) , .. } ) => Some ( fn_decl) ,
67
47
_ => None ,
68
48
}
69
49
}
70
50
71
51
fn fn_sig < ' hir > ( node : Node < ' hir > ) -> Option < & ' hir FnSig < ' hir > > {
72
52
match & node {
73
- Node :: Item ( item) => match & item. kind {
74
- ItemKind :: Fn ( sig, _, _) => Some ( sig) ,
75
- _ => None ,
76
- } ,
77
-
78
- Node :: TraitItem ( item) => match & item. kind {
79
- TraitItemKind :: Fn ( sig, _) => Some ( sig) ,
80
- _ => None ,
81
- } ,
82
-
83
- Node :: ImplItem ( item) => match & item. kind {
84
- ImplItemKind :: Fn ( sig, _) => Some ( sig) ,
85
- _ => None ,
86
- } ,
87
-
53
+ Node :: Item ( Item { kind : ItemKind :: Fn ( sig, _, _) , .. } )
54
+ | Node :: TraitItem ( TraitItem { kind : TraitItemKind :: Fn ( sig, _) , .. } )
55
+ | Node :: ImplItem ( ImplItem { kind : ImplItemKind :: Fn ( sig, _) , .. } ) => Some ( sig) ,
88
56
_ => None ,
89
57
}
90
58
}
91
59
92
60
fn associated_body < ' hir > ( node : Node < ' hir > ) -> Option < BodyId > {
93
61
match node {
94
- Node :: Item ( item) => match item. kind {
95
- ItemKind :: Const ( _, body) | ItemKind :: Static ( .., body) | ItemKind :: Fn ( .., body) => {
96
- Some ( body)
97
- }
98
- _ => None ,
99
- } ,
100
-
101
- Node :: TraitItem ( item) => match item. kind {
102
- TraitItemKind :: Const ( _, Some ( body) ) | TraitItemKind :: Fn ( _, TraitFn :: Provided ( body) ) => {
103
- Some ( body)
104
- }
105
- _ => None ,
106
- } ,
107
-
108
- Node :: ImplItem ( item) => match item. kind {
109
- ImplItemKind :: Const ( _, body) | ImplItemKind :: Fn ( _, body) => Some ( body) ,
110
- _ => None ,
111
- } ,
62
+ Node :: Item ( Item {
63
+ kind : ItemKind :: Const ( _, body) | ItemKind :: Static ( .., body) | ItemKind :: Fn ( .., body) ,
64
+ ..
65
+ } )
66
+ | Node :: TraitItem ( TraitItem {
67
+ kind :
68
+ TraitItemKind :: Const ( _, Some ( body) ) | TraitItemKind :: Fn ( _, TraitFn :: Provided ( body) ) ,
69
+ ..
70
+ } )
71
+ | Node :: ImplItem ( ImplItem {
72
+ kind : ImplItemKind :: Const ( _, body) | ImplItemKind :: Fn ( _, body) ,
73
+ ..
74
+ } )
75
+ | Node :: Expr ( Expr { kind : ExprKind :: Closure ( .., body, _, _) , .. } ) => Some ( * body) ,
112
76
113
77
Node :: AnonConst ( constant) => Some ( constant. body ) ,
114
78
115
- Node :: Expr ( expr) => match expr. kind {
116
- ExprKind :: Closure ( .., body, _, _) => Some ( body) ,
117
- _ => None ,
118
- } ,
119
-
120
79
_ => None ,
121
80
}
122
81
}
@@ -520,20 +479,21 @@ impl<'hir> Map<'hir> {
520
479
}
521
480
522
481
pub fn get_generics ( & self , id : DefId ) -> Option < & ' hir Generics < ' hir > > {
523
- self . get_if_local ( id) . and_then ( |node| match node {
524
- Node :: ImplItem ( ref impl_item) => Some ( & impl_item. generics ) ,
525
- Node :: TraitItem ( ref trait_item) => Some ( & trait_item. generics ) ,
526
- Node :: Item ( ref item) => match item. kind {
527
- ItemKind :: Fn ( _, ref generics, _)
528
- | ItemKind :: TyAlias ( _, ref generics)
529
- | ItemKind :: Enum ( _, ref generics)
530
- | ItemKind :: Struct ( _, ref generics)
531
- | ItemKind :: Union ( _, ref generics)
532
- | ItemKind :: Trait ( _, _, ref generics, ..)
533
- | ItemKind :: TraitAlias ( ref generics, _)
534
- | ItemKind :: Impl { ref generics, .. } => Some ( generics) ,
535
- _ => None ,
536
- } ,
482
+ self . get_if_local ( id) . and_then ( |node| match & node {
483
+ Node :: ImplItem ( impl_item) => Some ( & impl_item. generics ) ,
484
+ Node :: TraitItem ( trait_item) => Some ( & trait_item. generics ) ,
485
+ Node :: Item ( Item {
486
+ kind :
487
+ ItemKind :: Fn ( _, generics, _)
488
+ | ItemKind :: TyAlias ( _, generics)
489
+ | ItemKind :: Enum ( _, generics)
490
+ | ItemKind :: Struct ( _, generics)
491
+ | ItemKind :: Union ( _, generics)
492
+ | ItemKind :: Trait ( _, _, generics, ..)
493
+ | ItemKind :: TraitAlias ( generics, _)
494
+ | ItemKind :: Impl { generics, .. } ,
495
+ ..
496
+ } ) => Some ( generics) ,
537
497
_ => None ,
538
498
} )
539
499
}
@@ -573,11 +533,12 @@ impl<'hir> Map<'hir> {
573
533
_ => return false ,
574
534
}
575
535
match self . find ( self . get_parent_node ( id) ) {
576
- Some ( Node :: Item ( _) ) | Some ( Node :: TraitItem ( _) ) | Some ( Node :: ImplItem ( _) ) => true ,
577
- Some ( Node :: Expr ( e) ) => match e. kind {
578
- ExprKind :: Closure ( ..) => true ,
579
- _ => false ,
580
- } ,
536
+ Some (
537
+ Node :: Item ( _)
538
+ | Node :: TraitItem ( _)
539
+ | Node :: ImplItem ( _)
540
+ | Node :: Expr ( Expr { kind : ExprKind :: Closure ( ..) , .. } ) ,
541
+ ) => true ,
581
542
_ => false ,
582
543
}
583
544
}
@@ -644,12 +605,8 @@ impl<'hir> Map<'hir> {
644
605
if let ( Some ( ( _, next_node) ) , false ) = ( iter. peek ( ) , ignore_tail) {
645
606
match next_node {
646
607
Node :: Block ( Block { expr : None , .. } ) => return None ,
647
- Node :: Block ( Block { expr : Some ( expr) , .. } ) => {
648
- if hir_id != expr. hir_id {
649
- // The current node is not the tail expression of its parent.
650
- return None ;
651
- }
652
- }
608
+ // The current node is not the tail expression of its parent.
609
+ Node :: Block ( Block { expr : Some ( e) , .. } ) if hir_id != e. hir_id => return None ,
653
610
_ => { }
654
611
}
655
612
}
@@ -659,14 +616,11 @@ impl<'hir> Map<'hir> {
659
616
| Node :: TraitItem ( _)
660
617
| Node :: Expr ( Expr { kind : ExprKind :: Closure ( ..) , .. } )
661
618
| Node :: ImplItem ( _) => return Some ( hir_id) ,
662
- Node :: Expr ( ref expr) => {
663
- match expr. kind {
664
- // Ignore `return`s on the first iteration
665
- ExprKind :: Loop ( ..) | ExprKind :: Ret ( ..) => return None ,
666
- _ => { }
667
- }
619
+ // Ignore `return`s on the first iteration
620
+ Node :: Expr ( Expr { kind : ExprKind :: Loop ( ..) | ExprKind :: Ret ( ..) , .. } )
621
+ | Node :: Local ( _) => {
622
+ return None ;
668
623
}
669
- Node :: Local ( _) => return None ,
670
624
_ => { }
671
625
}
672
626
}
@@ -710,17 +664,12 @@ impl<'hir> Map<'hir> {
710
664
pub fn get_match_if_cause ( & self , hir_id : HirId ) -> Option < & ' hir Expr < ' hir > > {
711
665
for ( _, node) in self . parent_iter ( hir_id) {
712
666
match node {
713
- Node :: Item ( _) | Node :: ForeignItem ( _) | Node :: TraitItem ( _) | Node :: ImplItem ( _) => {
714
- break ;
715
- }
716
- Node :: Expr ( expr) => match expr. kind {
717
- ExprKind :: Match ( _, _, _) => return Some ( expr) ,
718
- _ => { }
719
- } ,
720
- Node :: Stmt ( stmt) => match stmt. kind {
721
- StmtKind :: Local ( _) => break ,
722
- _ => { }
723
- } ,
667
+ Node :: Item ( _)
668
+ | Node :: ForeignItem ( _)
669
+ | Node :: TraitItem ( _)
670
+ | Node :: ImplItem ( _)
671
+ | Node :: Stmt ( Stmt { kind : StmtKind :: Local ( _) , .. } ) => break ,
672
+ Node :: Expr ( expr @ Expr { kind : ExprKind :: Match ( ..) , .. } ) => return Some ( expr) ,
724
673
_ => { }
725
674
}
726
675
}
@@ -730,32 +679,22 @@ impl<'hir> Map<'hir> {
730
679
/// Returns the nearest enclosing scope. A scope is roughly an item or block.
731
680
pub fn get_enclosing_scope ( & self , hir_id : HirId ) -> Option < HirId > {
732
681
for ( hir_id, node) in self . parent_iter ( hir_id) {
733
- if match node {
734
- Node :: Item ( i ) => match i . kind {
682
+ if let Node :: Item ( Item {
683
+ kind :
735
684
ItemKind :: Fn ( ..)
736
685
| ItemKind :: Mod ( ..)
737
686
| ItemKind :: Enum ( ..)
738
687
| ItemKind :: Struct ( ..)
739
688
| ItemKind :: Union ( ..)
740
689
| ItemKind :: Trait ( ..)
741
- | ItemKind :: Impl { .. } => true ,
742
- _ => false ,
743
- } ,
744
- Node :: ForeignItem ( fi) => match fi. kind {
745
- ForeignItemKind :: Fn ( ..) => true ,
746
- _ => false ,
747
- } ,
748
- Node :: TraitItem ( ti) => match ti. kind {
749
- TraitItemKind :: Fn ( ..) => true ,
750
- _ => false ,
751
- } ,
752
- Node :: ImplItem ( ii) => match ii. kind {
753
- ImplItemKind :: Fn ( ..) => true ,
754
- _ => false ,
755
- } ,
756
- Node :: Block ( _) => true ,
757
- _ => false ,
758
- } {
690
+ | ItemKind :: Impl { .. } ,
691
+ ..
692
+ } )
693
+ | Node :: ForeignItem ( ForeignItem { kind : ForeignItemKind :: Fn ( ..) , .. } )
694
+ | Node :: TraitItem ( TraitItem { kind : TraitItemKind :: Fn ( ..) , .. } )
695
+ | Node :: ImplItem ( ImplItem { kind : ImplItemKind :: Fn ( ..) , .. } )
696
+ | Node :: Block ( _) = node
697
+ {
759
698
return Some ( hir_id) ;
760
699
}
761
700
}
@@ -771,11 +710,11 @@ impl<'hir> Map<'hir> {
771
710
return CRATE_HIR_ID ;
772
711
}
773
712
match self . get ( scope) {
774
- Node :: Item ( i ) => match i . kind {
775
- ItemKind :: OpaqueTy ( OpaqueTy { impl_trait_fn : None , .. } ) => { }
776
- _ => break ,
777
- } ,
778
- Node :: Block ( _) => { }
713
+ Node :: Item ( Item {
714
+ kind : ItemKind :: OpaqueTy ( OpaqueTy { impl_trait_fn : None , .. } ) ,
715
+ ..
716
+ } )
717
+ | Node :: Block ( _) => { }
779
718
_ => break ,
780
719
}
781
720
}
@@ -823,14 +762,11 @@ impl<'hir> Map<'hir> {
823
762
824
763
pub fn expect_variant_data ( & self , id : HirId ) -> & ' hir VariantData < ' hir > {
825
764
match self . find ( id) {
826
- Some ( Node :: Item ( i) ) => match i. kind {
827
- ItemKind :: Struct ( ref struct_def, _) | ItemKind :: Union ( ref struct_def, _) => {
828
- struct_def
829
- }
830
- _ => bug ! ( "struct ID bound to non-struct {}" , self . node_to_string( id) ) ,
831
- } ,
765
+ Some (
766
+ Node :: Ctor ( vd)
767
+ | Node :: Item ( Item { kind : ItemKind :: Struct ( vd, _) | ItemKind :: Union ( vd, _) , .. } ) ,
768
+ ) => vd,
832
769
Some ( Node :: Variant ( variant) ) => & variant. data ,
833
- Some ( Node :: Ctor ( data) ) => data,
834
770
_ => bug ! ( "expected struct or variant, found {}" , self . node_to_string( id) ) ,
835
771
}
836
772
}
0 commit comments