1
1
use rustc_abi:: ExternAbi ;
2
2
use rustc_ast:: ptr:: P ;
3
- use rustc_ast:: visit:: AssocCtxt ;
4
3
use rustc_ast:: * ;
5
4
use rustc_attr_data_structures:: { AttributeKind , find_attr} ;
6
5
use rustc_errors:: { E0570 , ErrorGuaranteed , struct_span_code_err} ;
7
6
use rustc_hir:: def:: { DefKind , PerNS , Res } ;
8
- use rustc_hir:: def_id:: { CRATE_DEF_ID , LocalDefId } ;
7
+ use rustc_hir:: def_id:: CRATE_DEF_ID ;
9
8
use rustc_hir:: { self as hir, HirId , LifetimeSource , PredicateOrigin } ;
10
- use rustc_index:: { IndexSlice , IndexVec } ;
11
9
use rustc_middle:: span_bug;
12
10
use rustc_middle:: ty:: { ResolverAstLowering , TyCtxt } ;
13
11
use rustc_span:: edit_distance:: find_best_match_for_name;
14
- use rustc_span:: { DUMMY_SP , DesugaringKind , Ident , Span , Symbol , kw, sym} ;
12
+ use rustc_span:: { DesugaringKind , Ident , Span , Symbol , kw, sym} ;
15
13
use smallvec:: { SmallVec , smallvec} ;
16
14
use thin_vec:: ThinVec ;
17
15
use tracing:: instrument;
@@ -22,15 +20,13 @@ use super::errors::{
22
20
} ;
23
21
use super :: stability:: { enabled_names, gate_unstable_abi} ;
24
22
use super :: {
25
- AstOwner , FnDeclKind , ImplTraitContext , ImplTraitPosition , LoweringContext , ParamMode ,
23
+ FnDeclKind , ImplTraitContext , ImplTraitPosition , LoweringContext , ParamMode ,
26
24
ResolverAstLoweringExt ,
27
25
} ;
28
26
29
- pub ( super ) struct ItemLowerer < ' a , ' hir > {
27
+ pub ( super ) struct ItemLowerer < ' hir > {
30
28
pub ( super ) tcx : TyCtxt < ' hir > ,
31
29
pub ( super ) resolver : & ' hir ResolverAstLowering ,
32
- pub ( super ) ast_index : & ' a IndexSlice < LocalDefId , AstOwner < ' a > > ,
33
- pub ( super ) owners : & ' a mut IndexVec < LocalDefId , hir:: MaybeOwner < ' hir > > ,
34
30
}
35
31
36
32
/// When we have a ty alias we *may* have two where clauses. To give the best diagnostics, we set the span
@@ -54,51 +50,47 @@ fn add_ty_alias_where_clause(
54
50
generics. where_clause . span = where_clause. span ;
55
51
}
56
52
57
- impl < ' a , ' hir > ItemLowerer < ' a , ' hir > {
53
+ impl < ' hir > ItemLowerer < ' hir > {
58
54
fn with_lctx (
59
55
& mut self ,
60
56
owner : NodeId ,
61
57
f : impl FnOnce ( & mut LoweringContext < ' hir > ) -> hir:: OwnerNode < ' hir > ,
62
- ) {
63
- let mut lctx = LoweringContext :: new ( self . tcx , self . resolver ) ;
64
- lctx. with_hir_id_owner ( owner, |lctx| f ( lctx) ) ;
65
-
66
- for ( def_id, info) in lctx. children {
67
- let owner = self . owners . ensure_contains_elem ( def_id, || hir:: MaybeOwner :: Phantom ) ;
68
- assert ! (
69
- matches!( owner, hir:: MaybeOwner :: Phantom ) ,
70
- "duplicate copy of {def_id:?} in lctx.children"
71
- ) ;
72
- * owner = info;
73
- }
58
+ ) -> hir:: MaybeOwner < ' hir > {
59
+ let mut lctx = LoweringContext :: new ( self . tcx , self . resolver , owner) ;
60
+
61
+ let item = f ( & mut lctx) ;
62
+ debug_assert_eq ! ( lctx. current_hir_id_owner, item. def_id( ) ) ;
63
+
64
+ let info = lctx. make_owner_info ( item) ;
65
+
66
+ hir:: MaybeOwner :: Owner ( lctx. arena . alloc ( info) )
74
67
}
75
68
76
- pub ( super ) fn lower_node ( & mut self , def_id : LocalDefId ) {
77
- let owner = self . owners . ensure_contains_elem ( def_id, || hir:: MaybeOwner :: Phantom ) ;
78
- if let hir:: MaybeOwner :: Phantom = owner {
79
- let node = self . ast_index [ def_id] ;
80
- match node {
81
- AstOwner :: NonOwner => { }
82
- AstOwner :: Crate ( c) => {
83
- assert_eq ! ( self . resolver. node_id_to_def_id[ & CRATE_NODE_ID ] , CRATE_DEF_ID ) ;
84
- self . with_lctx ( CRATE_NODE_ID , |lctx| {
85
- let module = lctx. lower_mod ( & c. items , & c. spans ) ;
86
- // FIXME(jdonszelman): is dummy span ever a problem here?
87
- lctx. lower_attrs ( hir:: CRATE_HIR_ID , & c. attrs , DUMMY_SP ) ;
88
- hir:: OwnerNode :: Crate ( module)
89
- } )
90
- }
91
- AstOwner :: Item ( item) => {
92
- self . with_lctx ( item. id , |lctx| hir:: OwnerNode :: Item ( lctx. lower_item ( item) ) )
93
- }
94
- AstOwner :: AssocItem ( item, ctxt) => {
95
- self . with_lctx ( item. id , |lctx| lctx. lower_assoc_item ( item, ctxt) )
96
- }
97
- AstOwner :: ForeignItem ( item) => self . with_lctx ( item. id , |lctx| {
98
- hir:: OwnerNode :: ForeignItem ( lctx. lower_foreign_item ( item) )
99
- } ) ,
100
- }
101
- }
69
+ #[ instrument( level = "debug" , skip( self , c) ) ]
70
+ pub ( super ) fn lower_crate ( & mut self , c : & Crate ) -> hir:: MaybeOwner < ' hir > {
71
+ debug_assert_eq ! ( self . resolver. node_id_to_def_id[ & CRATE_NODE_ID ] , CRATE_DEF_ID ) ;
72
+ self . with_lctx ( CRATE_NODE_ID , |lctx| {
73
+ let module = lctx. lower_mod ( & c. items , & c. spans ) ;
74
+ lctx. lower_attrs ( hir:: CRATE_HIR_ID , & c. attrs , c. spans . inner_span ) ;
75
+ hir:: OwnerNode :: Crate ( module)
76
+ } )
77
+ }
78
+
79
+ #[ instrument( level = "debug" , skip( self ) ) ]
80
+ pub ( super ) fn lower_item ( & mut self , item : & Item ) -> hir:: MaybeOwner < ' hir > {
81
+ self . with_lctx ( item. id , |lctx| hir:: OwnerNode :: Item ( lctx. lower_item ( item) ) )
82
+ }
83
+
84
+ pub ( super ) fn lower_trait_item ( & mut self , item : & AssocItem ) -> hir:: MaybeOwner < ' hir > {
85
+ self . with_lctx ( item. id , |lctx| hir:: OwnerNode :: TraitItem ( lctx. lower_trait_item ( item) ) )
86
+ }
87
+
88
+ pub ( super ) fn lower_impl_item ( & mut self , item : & AssocItem ) -> hir:: MaybeOwner < ' hir > {
89
+ self . with_lctx ( item. id , |lctx| hir:: OwnerNode :: ImplItem ( lctx. lower_impl_item ( item) ) )
90
+ }
91
+
92
+ pub ( super ) fn lower_foreign_item ( & mut self , item : & ForeignItem ) -> hir:: MaybeOwner < ' hir > {
93
+ self . with_lctx ( item. id , |lctx| hir:: OwnerNode :: ForeignItem ( lctx. lower_foreign_item ( item) ) )
102
94
}
103
95
}
104
96
@@ -138,12 +130,13 @@ impl<'hir> LoweringContext<'hir> {
138
130
}
139
131
140
132
fn lower_item ( & mut self , i : & Item ) -> & ' hir hir:: Item < ' hir > {
133
+ let owner_id = self . current_hir_id_owner ;
134
+ let hir_id: HirId = owner_id. into ( ) ;
141
135
let vis_span = self . lower_span ( i. vis . span ) ;
142
- let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
143
136
let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
144
137
let kind = self . lower_item_kind ( i. span , i. id , hir_id, attrs, vis_span, & i. kind ) ;
145
138
let item = hir:: Item {
146
- owner_id : hir_id . expect_owner ( ) ,
139
+ owner_id,
147
140
kind,
148
141
vis_span,
149
142
span : self . lower_span ( i. span ) ,
@@ -626,21 +619,9 @@ impl<'hir> LoweringContext<'hir> {
626
619
}
627
620
}
628
621
629
- fn lower_assoc_item ( & mut self , item : & AssocItem , ctxt : AssocCtxt ) -> hir:: OwnerNode < ' hir > {
630
- // Evaluate with the lifetimes in `params` in-scope.
631
- // This is used to track which lifetimes have already been defined,
632
- // and which need to be replicated when lowering an async fn.
633
- match ctxt {
634
- AssocCtxt :: Trait => hir:: OwnerNode :: TraitItem ( self . lower_trait_item ( item) ) ,
635
- AssocCtxt :: Impl { of_trait } => {
636
- hir:: OwnerNode :: ImplItem ( self . lower_impl_item ( item, of_trait) )
637
- }
638
- }
639
- }
640
-
641
622
fn lower_foreign_item ( & mut self , i : & ForeignItem ) -> & ' hir hir:: ForeignItem < ' hir > {
642
- let hir_id = hir :: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
643
- let owner_id = hir_id . expect_owner ( ) ;
623
+ let owner_id = self . current_hir_id_owner ;
624
+ let hir_id : HirId = owner_id . into ( ) ;
644
625
let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
645
626
let ( ident, kind) = match & i. kind {
646
627
ForeignItemKind :: Fn ( box Fn { sig, ident, generics, define_opaque, .. } ) => {
@@ -811,9 +792,9 @@ impl<'hir> LoweringContext<'hir> {
811
792
}
812
793
813
794
fn lower_trait_item ( & mut self , i : & AssocItem ) -> & ' hir hir:: TraitItem < ' hir > {
814
- let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
795
+ let trait_item_def_id = self . current_hir_id_owner ;
796
+ let hir_id: HirId = trait_item_def_id. into ( ) ;
815
797
let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
816
- let trait_item_def_id = hir_id. expect_owner ( ) ;
817
798
818
799
let ( ident, generics, kind, has_default) = match & i. kind {
819
800
AssocItemKind :: Const ( box ConstItem {
@@ -973,15 +954,16 @@ impl<'hir> LoweringContext<'hir> {
973
954
self . expr ( span, hir:: ExprKind :: Err ( guar) )
974
955
}
975
956
976
- fn lower_impl_item (
977
- & mut self ,
978
- i : & AssocItem ,
979
- is_in_trait_impl : bool ,
980
- ) -> & ' hir hir:: ImplItem < ' hir > {
957
+ fn lower_impl_item ( & mut self , i : & AssocItem ) -> & ' hir hir:: ImplItem < ' hir > {
958
+ let owner_id = self . current_hir_id_owner ;
959
+ let hir_id: HirId = owner_id. into ( ) ;
960
+ let parent_id = self . tcx . local_parent ( owner_id. def_id ) ;
961
+ let is_in_trait_impl =
962
+ matches ! ( self . tcx. def_kind( parent_id) , DefKind :: Impl { of_trait: true } ) ;
963
+
981
964
// Since `default impl` is not yet implemented, this is always true in impls.
982
965
let has_value = true ;
983
966
let ( defaultness, _) = self . lower_defaultness ( i. kind . defaultness ( ) , has_value) ;
984
- let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
985
967
let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
986
968
987
969
let ( ident, ( generics, kind) ) = match & i. kind {
@@ -1088,7 +1070,7 @@ impl<'hir> LoweringContext<'hir> {
1088
1070
} ;
1089
1071
1090
1072
let item = hir:: ImplItem {
1091
- owner_id : hir_id . expect_owner ( ) ,
1073
+ owner_id,
1092
1074
ident : self . lower_ident ( ident) ,
1093
1075
generics,
1094
1076
kind,
0 commit comments