@@ -60,7 +60,6 @@ use rustc_hir::{
60
60
TraitCandidate ,
61
61
} ;
62
62
use rustc_index:: { Idx , IndexSlice , IndexVec } ;
63
- use rustc_macros:: extension;
64
63
use rustc_middle:: span_bug;
65
64
use rustc_middle:: ty:: { PerOwnerResolverData , ResolverAstLowering , TyCtxt } ;
66
65
use rustc_session:: parse:: { add_feature_diagnostics, feature_err} ;
@@ -94,7 +93,7 @@ rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
94
93
95
94
struct LoweringContext < ' a , ' hir > {
96
95
tcx : TyCtxt < ' hir > ,
97
- resolver : & ' a mut ResolverAstLowering ,
96
+ resolver : PerOwnerResolver < ' a > ,
98
97
99
98
/// Used to allocate HIR nodes.
100
99
arena : & ' hir hir:: Arena < ' hir > ,
@@ -126,7 +125,6 @@ struct LoweringContext<'a, 'hir> {
126
125
is_in_dyn_type : bool ,
127
126
128
127
current_hir_id_owner : hir:: OwnerId ,
129
- current_ast_id_owner : PerOwnerResolverData ,
130
128
item_local_id_counter : hir:: ItemLocalId ,
131
129
trait_map : ItemLocalMap < Box < [ TraitCandidate ] > > ,
132
130
@@ -155,7 +153,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
155
153
Self {
156
154
// Pseudo-globals.
157
155
tcx,
158
- resolver,
156
+ resolver : PerOwnerResolver {
157
+ general : resolver,
158
+ item : PerOwnerResolverData :: new ( DUMMY_NODE_ID ) ,
159
+ } ,
159
160
arena : tcx. hir_arena ,
160
161
161
162
// HirId handling.
@@ -165,7 +166,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
165
166
children : Vec :: default ( ) ,
166
167
contract_ensures : None ,
167
168
current_hir_id_owner : hir:: CRATE_OWNER_ID ,
168
- current_ast_id_owner : PerOwnerResolverData :: new ( DUMMY_NODE_ID ) ,
169
169
item_local_id_counter : hir:: ItemLocalId :: ZERO ,
170
170
ident_and_label_to_local_id : Default :: default ( ) ,
171
171
#[ cfg( debug_assertions) ]
@@ -204,8 +204,20 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
204
204
}
205
205
}
206
206
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 < ' _ > {
209
221
fn legacy_const_generic_args ( & self , expr : & Expr ) -> Option < Vec < usize > > {
210
222
if let ExprKind :: Path ( None , path) = & expr. kind {
211
223
// Don't perform legacy const generics rewriting if the path already
@@ -214,15 +226,17 @@ impl ResolverAstLowering {
214
226
return None ;
215
227
}
216
228
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
+ {
218
232
// We only support cross-crate argument rewriting. Uses
219
233
// within the same crate should be updated to use the new
220
234
// const generics style.
221
235
if def_id. is_local ( ) {
222
236
return None ;
223
237
}
224
238
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) {
226
240
return v. clone ( ) ;
227
241
}
228
242
}
@@ -232,22 +246,22 @@ impl ResolverAstLowering {
232
246
}
233
247
234
248
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 ( )
236
250
}
237
251
238
252
/// Obtains per-namespace resolutions for `use` statement with the given `NodeId`.
239
253
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 ( )
241
255
}
242
256
243
257
/// Obtains resolution for a label with the given `NodeId`.
244
258
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 ( )
246
260
}
247
261
248
262
/// Obtains resolution for a lifetime with the given `NodeId`.
249
263
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 ( )
251
265
}
252
266
253
267
/// Obtain the list of lifetimes parameters to add to an item.
@@ -258,7 +272,7 @@ impl ResolverAstLowering {
258
272
/// The extra lifetimes that appear from the parenthesized `Fn`-trait desugaring
259
273
/// should appear at the enclosing `PolyTraitRef`.
260
274
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 ( )
262
276
}
263
277
}
264
278
@@ -537,27 +551,27 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
537
551
self . tcx . at ( span) . create_def ( self . current_hir_id_owner . def_id , name, def_kind) . def_id ( ) ;
538
552
539
553
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) ;
541
555
542
556
def_id
543
557
}
544
558
545
559
fn next_node_id ( & mut self ) -> NodeId {
546
- let start = self . resolver . next_node_id ;
560
+ let start = self . resolver . general . next_node_id ;
547
561
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) ;
549
563
start
550
564
}
551
565
552
566
/// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
553
567
/// resolver (if any).
554
568
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 ( )
556
570
}
557
571
558
572
fn local_def_id ( & self , node : NodeId ) -> LocalDefId {
559
573
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) | {
561
575
items. node_id_to_def_id . items ( ) . any ( |( node_id, def_id) | {
562
576
if * node_id == node {
563
577
panic ! (
@@ -574,7 +588,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
574
588
575
589
/// Given the id of an owner node in the AST, returns the corresponding `OwnerId`.
576
590
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] }
578
592
}
579
593
580
594
/// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -593,9 +607,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
593
607
let current_attrs = std:: mem:: take ( & mut self . attrs ) ;
594
608
let current_bodies = std:: mem:: take ( & mut self . bodies ) ;
595
609
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 ( ) ,
599
613
) ;
600
614
let current_ident_and_label_to_local_id =
601
615
std:: mem:: take ( & mut self . ident_and_label_to_local_id ) ;
@@ -641,7 +655,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
641
655
self . item_local_id_counter = current_local_counter;
642
656
self . impl_trait_defs = current_impl_trait_defs;
643
657
self . impl_trait_bounds = current_impl_trait_bounds;
644
- self . current_ast_id_owner = current_ast_owner ;
658
+ self . resolver . item = current_item_resolver ;
645
659
646
660
debug_assert ! ( !self . children. iter( ) . any( |( id, _) | id == & owner_id. def_id) ) ;
647
661
self . children . push ( ( owner_id. def_id , hir:: MaybeOwner :: Owner ( info) ) ) ;
@@ -694,7 +708,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
694
708
self . children . push ( ( def_id, hir:: MaybeOwner :: NonOwner ( hir_id) ) ) ;
695
709
}
696
710
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) {
698
712
self . trait_map . insert ( hir_id. local_id , traits. into_boxed_slice ( ) ) ;
699
713
}
700
714
@@ -1646,7 +1660,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1646
1660
inputs,
1647
1661
output,
1648
1662
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) ,
1650
1668
implicit_self : decl. inputs . get ( 0 ) . map_or ( hir:: ImplicitSelfKind :: None , |arg| {
1651
1669
let is_mutable_pat = matches ! (
1652
1670
arg. pat. kind,
0 commit comments