@@ -60,7 +60,6 @@ use rustc_hir::{
6060 TraitCandidate ,
6161} ;
6262use rustc_index:: { Idx , IndexSlice , IndexVec } ;
63- use rustc_macros:: extension;
6463use rustc_middle:: span_bug;
6564use rustc_middle:: ty:: { PerOwnerResolverData , ResolverAstLowering , TyCtxt } ;
6665use rustc_session:: parse:: { add_feature_diagnostics, feature_err} ;
@@ -94,7 +93,7 @@ rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
9493
9594struct LoweringContext < ' a , ' hir > {
9695 tcx : TyCtxt < ' hir > ,
97- resolver : & ' a mut ResolverAstLowering ,
96+ resolver : PerOwnerResolver < ' a > ,
9897
9998 /// Used to allocate HIR nodes.
10099 arena : & ' hir hir:: Arena < ' hir > ,
@@ -126,7 +125,6 @@ struct LoweringContext<'a, 'hir> {
126125 is_in_dyn_type : bool ,
127126
128127 current_hir_id_owner : hir:: OwnerId ,
129- current_ast_id_owner : PerOwnerResolverData ,
130128 item_local_id_counter : hir:: ItemLocalId ,
131129 trait_map : ItemLocalMap < Box < [ TraitCandidate ] > > ,
132130
@@ -155,7 +153,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
155153 Self {
156154 // Pseudo-globals.
157155 tcx,
158- resolver,
156+ resolver : PerOwnerResolver {
157+ general : resolver,
158+ item : PerOwnerResolverData :: new ( DUMMY_NODE_ID ) ,
159+ } ,
159160 arena : tcx. hir_arena ,
160161
161162 // HirId handling.
@@ -165,7 +166,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
165166 children : Vec :: default ( ) ,
166167 contract_ensures : None ,
167168 current_hir_id_owner : hir:: CRATE_OWNER_ID ,
168- current_ast_id_owner : PerOwnerResolverData :: new ( DUMMY_NODE_ID ) ,
169169 item_local_id_counter : hir:: ItemLocalId :: ZERO ,
170170 ident_and_label_to_local_id : Default :: default ( ) ,
171171 #[ cfg( debug_assertions) ]
@@ -204,8 +204,20 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
204204 }
205205}
206206
207- #[ extension( trait ResolverAstLoweringExt ) ]
208- impl ResolverAstLowering {
207+ pub ( crate ) struct PerOwnerResolver < ' a > {
208+ pub general : & ' a mut ResolverAstLowering ,
209+ pub item : PerOwnerResolverData ,
210+ }
211+
212+ impl < ' a > std:: ops:: Deref for PerOwnerResolver < ' a > {
213+ type Target = PerOwnerResolverData ;
214+
215+ fn deref ( & self ) -> & Self :: Target {
216+ & self . item
217+ }
218+ }
219+
220+ impl PerOwnerResolver < ' _ > {
209221 fn legacy_const_generic_args ( & self , expr : & Expr ) -> Option < Vec < usize > > {
210222 if let ExprKind :: Path ( None , path) = & expr. kind {
211223 // Don't perform legacy const generics rewriting if the path already
@@ -214,15 +226,17 @@ impl ResolverAstLowering {
214226 return None ;
215227 }
216228
217- if let Res :: Def ( DefKind :: Fn , def_id) = self . partial_res_map . get ( & expr. id ) ?. full_res ( ) ? {
229+ if let Res :: Def ( DefKind :: Fn , def_id) =
230+ self . general . partial_res_map . get ( & expr. id ) ?. full_res ( ) ?
231+ {
218232 // We only support cross-crate argument rewriting. Uses
219233 // within the same crate should be updated to use the new
220234 // const generics style.
221235 if def_id. is_local ( ) {
222236 return None ;
223237 }
224238
225- if let Some ( v) = self . legacy_const_generic_args . get ( & def_id) {
239+ if let Some ( v) = self . general . legacy_const_generic_args . get ( & def_id) {
226240 return v. clone ( ) ;
227241 }
228242 }
@@ -232,22 +246,22 @@ impl ResolverAstLowering {
232246 }
233247
234248 fn get_partial_res ( & self , id : NodeId ) -> Option < PartialRes > {
235- self . partial_res_map . get ( & id) . copied ( )
249+ self . general . partial_res_map . get ( & id) . copied ( )
236250 }
237251
238252 /// Obtains per-namespace resolutions for `use` statement with the given `NodeId`.
239253 fn get_import_res ( & self , id : NodeId ) -> PerNS < Option < Res < NodeId > > > {
240- self . import_res_map . get ( & id) . copied ( ) . unwrap_or_default ( )
254+ self . general . import_res_map . get ( & id) . copied ( ) . unwrap_or_default ( )
241255 }
242256
243257 /// Obtains resolution for a label with the given `NodeId`.
244258 fn get_label_res ( & self , id : NodeId ) -> Option < NodeId > {
245- self . label_res_map . get ( & id) . copied ( )
259+ self . general . label_res_map . get ( & id) . copied ( )
246260 }
247261
248262 /// Obtains resolution for a lifetime with the given `NodeId`.
249263 fn get_lifetime_res ( & self , id : NodeId ) -> Option < LifetimeRes > {
250- self . lifetimes_res_map . get ( & id) . copied ( )
264+ self . general . lifetimes_res_map . get ( & id) . copied ( )
251265 }
252266
253267 /// Obtain the list of lifetimes parameters to add to an item.
@@ -258,7 +272,7 @@ impl ResolverAstLowering {
258272 /// The extra lifetimes that appear from the parenthesized `Fn`-trait desugaring
259273 /// should appear at the enclosing `PolyTraitRef`.
260274 fn extra_lifetime_params ( & self , id : NodeId ) -> Vec < ( Ident , NodeId , LifetimeRes ) > {
261- self . extra_lifetime_params_map . get ( & id) . cloned ( ) . unwrap_or_default ( )
275+ self . general . extra_lifetime_params_map . get ( & id) . cloned ( ) . unwrap_or_default ( )
262276 }
263277}
264278
@@ -537,27 +551,27 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
537551 self . tcx . at ( span) . create_def ( self . current_hir_id_owner . def_id , name, def_kind) . def_id ( ) ;
538552
539553 debug ! ( "create_def: def_id_to_node_id[{:?}] <-> {:?}" , def_id, node_id) ;
540- self . current_ast_id_owner . node_id_to_def_id . insert ( node_id, def_id) ;
554+ self . resolver . item . node_id_to_def_id . insert ( node_id, def_id) ;
541555
542556 def_id
543557 }
544558
545559 fn next_node_id ( & mut self ) -> NodeId {
546- let start = self . resolver . next_node_id ;
560+ let start = self . resolver . general . next_node_id ;
547561 let next = start. as_u32 ( ) . checked_add ( 1 ) . expect ( "input too large; ran out of NodeIds" ) ;
548- self . resolver . next_node_id = ast:: NodeId :: from_u32 ( next) ;
562+ self . resolver . general . next_node_id = ast:: NodeId :: from_u32 ( next) ;
549563 start
550564 }
551565
552566 /// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
553567 /// resolver (if any).
554568 fn opt_local_def_id ( & self , node : NodeId ) -> Option < LocalDefId > {
555- self . current_ast_id_owner . node_id_to_def_id . get ( & node) . copied ( )
569+ self . resolver . item . node_id_to_def_id . get ( & node) . copied ( )
556570 }
557571
558572 fn local_def_id ( & self , node : NodeId ) -> LocalDefId {
559573 self . opt_local_def_id ( node) . unwrap_or_else ( || {
560- self . resolver . owners . items ( ) . any ( |( id, items) | {
574+ self . resolver . general . owners . items ( ) . any ( |( id, items) | {
561575 items. node_id_to_def_id . items ( ) . any ( |( node_id, def_id) | {
562576 if * node_id == node {
563577 panic ! (
@@ -574,7 +588,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
574588
575589 /// Given the id of an owner node in the AST, returns the corresponding `OwnerId`.
576590 fn owner_id ( & self , node : NodeId ) -> hir:: OwnerId {
577- hir:: OwnerId { def_id : self . resolver . owners [ & node] . node_id_to_def_id [ & node] }
591+ hir:: OwnerId { def_id : self . resolver . general . owners [ & node] . node_id_to_def_id [ & node] }
578592 }
579593
580594 /// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -593,9 +607,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
593607 let current_attrs = std:: mem:: take ( & mut self . attrs ) ;
594608 let current_bodies = std:: mem:: take ( & mut self . bodies ) ;
595609 let current_define_opaque = std:: mem:: take ( & mut self . define_opaque ) ;
596- let current_ast_owner = std:: mem:: replace (
597- & mut self . current_ast_id_owner ,
598- self . resolver . owners . remove ( & owner) . unwrap ( ) ,
610+ let current_item_resolver = std:: mem:: replace (
611+ & mut self . resolver . item ,
612+ self . resolver . general . owners . remove ( & owner) . unwrap ( ) ,
599613 ) ;
600614 let current_ident_and_label_to_local_id =
601615 std:: mem:: take ( & mut self . ident_and_label_to_local_id ) ;
@@ -641,7 +655,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
641655 self . item_local_id_counter = current_local_counter;
642656 self . impl_trait_defs = current_impl_trait_defs;
643657 self . impl_trait_bounds = current_impl_trait_bounds;
644- self . current_ast_id_owner = current_ast_owner ;
658+ self . resolver . item = current_item_resolver ;
645659
646660 debug_assert ! ( !self . children. iter( ) . any( |( id, _) | id == & owner_id. def_id) ) ;
647661 self . children . push ( ( owner_id. def_id , hir:: MaybeOwner :: Owner ( info) ) ) ;
@@ -694,7 +708,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
694708 self . children . push ( ( def_id, hir:: MaybeOwner :: NonOwner ( hir_id) ) ) ;
695709 }
696710
697- if let Some ( traits) = self . resolver . trait_map . remove ( & ast_node_id) {
711+ if let Some ( traits) = self . resolver . general . trait_map . remove ( & ast_node_id) {
698712 self . trait_map . insert ( hir_id. local_id , traits. into_boxed_slice ( ) ) ;
699713 }
700714
@@ -1646,7 +1660,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
16461660 inputs,
16471661 output,
16481662 c_variadic,
1649- lifetime_elision_allowed : self . resolver . lifetime_elision_allowed . contains ( & fn_node_id) ,
1663+ lifetime_elision_allowed : self
1664+ . resolver
1665+ . general
1666+ . lifetime_elision_allowed
1667+ . contains ( & fn_node_id) ,
16501668 implicit_self : decl. inputs . get ( 0 ) . map_or ( hir:: ImplicitSelfKind :: None , |arg| {
16511669 let is_mutable_pat = matches ! (
16521670 arg. pat. kind,
0 commit comments