@@ -70,7 +70,7 @@ use thin_vec::ThinVec;
7070use tracing:: { debug, instrument, trace} ;
7171
7272use crate :: errors:: { AssocTyParentheses , AssocTyParenthesesSub , MisplacedImplTrait } ;
73- use crate :: item:: Owners ;
73+ use crate :: item:: { Disambiguators , Owners } ;
7474
7575macro_rules! arena_vec {
7676 ( $this: expr; $( $x: expr) ,* ) => (
@@ -94,7 +94,8 @@ pub mod stability;
9494struct LoweringContext < ' a , ' hir , R > {
9595 tcx : TyCtxt < ' hir > ,
9696 resolver : & ' a mut R ,
97- disambiguator : PerParentDisambiguatorState ,
97+ disambiguators : & ' a mut Disambiguators ,
98+ current_disambiguator : PerParentDisambiguatorState ,
9899
99100 /// Used to allocate HIR nodes.
100101 arena : & ' hir hir:: Arena < ' hir > ,
@@ -154,12 +155,13 @@ struct LoweringContext<'a, 'hir, R> {
154155}
155156
156157impl < ' a , ' hir , R : ResolverAstLoweringExt < ' hir > > LoweringContext < ' a , ' hir , R > {
157- fn new ( tcx : TyCtxt < ' hir > , resolver : & ' a mut R ) -> Self {
158+ fn new ( tcx : TyCtxt < ' hir > , resolver : & ' a mut R , disambiguators : & ' a mut Disambiguators ) -> Self {
158159 let registered_tools = tcx. registered_tools ( ( ) ) . iter ( ) . map ( |x| x. name ) . collect ( ) ;
159160 Self {
160161 tcx,
161162 resolver,
162- disambiguator : Default :: default ( ) ,
163+ disambiguators,
164+ current_disambiguator : Default :: default ( ) ,
163165 arena : tcx. hir_arena ,
164166
165167 // HirId handling.
@@ -302,10 +304,6 @@ impl<'a, 'tcx> ResolverAstLoweringExt<'tcx> for ResolverDelayedAstLowering<'a, '
302304 fn next_node_id ( & mut self ) -> NodeId {
303305 next_node_id ( & mut self . next_node_id )
304306 }
305-
306- fn steal_or_create_disambiguator ( & self , parent : LocalDefId ) -> PerParentDisambiguatorState {
307- self . base . steal_or_create_disambiguator ( parent)
308- }
309307}
310308
311309fn next_node_id ( current_id : & mut NodeId ) -> NodeId {
@@ -408,10 +406,6 @@ impl<'tcx> ResolverAstLowering<'tcx> {
408406 fn next_node_id ( & mut self ) -> NodeId {
409407 next_node_id ( & mut self . next_node_id )
410408 }
411-
412- fn steal_or_create_disambiguator ( & self , parent : LocalDefId ) -> PerParentDisambiguatorState {
413- self . per_parent_disambiguators . get ( & parent) . map ( |s| s. steal ( ) ) . unwrap_or_default ( )
414- }
415409}
416410
417411/// How relaxed bounds `?Trait` should be treated.
@@ -632,11 +626,13 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> mid_hir::Crate<'_> {
632626 tcx. definitions_untracked ( ) . def_index_count ( ) ,
633627 ) ;
634628
629+ let mut disambiguators = Disambiguators :: Default ( resolver. disambiguators . steal ( ) ) ;
635630 let mut lowerer = item:: ItemLowerer {
636631 tcx,
637632 resolver : & mut resolver,
638633 ast_index : & ast_index,
639634 owners : Owners :: IndexVec ( & mut owners) ,
635+ disambiguators : & mut disambiguators,
640636 } ;
641637
642638 let mut delayed_ids: FxIndexSet < LocalDefId > = Default :: default ( ) ;
@@ -655,15 +651,19 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> mid_hir::Crate<'_> {
655651 let opt_hir_hash =
656652 if tcx. needs_crate_hash ( ) { Some ( compute_hir_hash ( tcx, & owners) ) } else { None } ;
657653
658- let delayed_resolver = Steal :: new ( ( resolver, krate) ) ;
654+ let Disambiguators :: Default ( disambiguators) = disambiguators else { unreachable ! ( ) } ;
655+ let delayed_disambigs =
656+ Arc :: new ( disambiguators. into_items ( ) . map ( |( id, d) | ( id, Steal :: new ( d) ) ) . collect ( ) ) ;
657+
658+ let delayed_resolver = Steal :: new ( ( resolver, krate, delayed_disambigs) ) ;
659659 mid_hir:: Crate :: new ( owners, delayed_ids, delayed_resolver, opt_hir_hash)
660660}
661661
662662/// Lowers an AST owner corresponding to `def_id`, now only delegations are lowered this way.
663663pub fn lower_delayed_owner ( tcx : TyCtxt < ' _ > , def_id : LocalDefId ) {
664664 let krate = tcx. hir_crate ( ( ) ) ;
665665
666- let ( resolver, krate) = & * krate. delayed_resolver . borrow ( ) ;
666+ let ( resolver, krate, delayed_disambigs ) = & * krate. delayed_resolver . borrow ( ) ;
667667
668668 // FIXME!!!(fn_delegation): make ast index lifetime same as resolver,
669669 // as it is too bad to reindex whole crate on each delegation lowering.
@@ -677,12 +677,12 @@ pub fn lower_delayed_owner(tcx: TyCtxt<'_>, def_id: LocalDefId) {
677677 } ;
678678
679679 let mut map = Default :: default ( ) ;
680-
681680 let mut lowerer = item:: ItemLowerer {
682681 tcx,
683682 resolver : & mut resolver,
684683 ast_index : & ast_index,
685684 owners : Owners :: Map ( & mut map) ,
685+ disambiguators : & mut Disambiguators :: Delayed ( Arc :: clone ( delayed_disambigs) ) ,
686686 } ;
687687
688688 lowerer. lower_node ( def_id) ;
@@ -740,7 +740,7 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
740740 let def_id = self
741741 . tcx
742742 . at ( span)
743- . create_def ( parent, name, def_kind, None , & mut self . disambiguator )
743+ . create_def ( parent, name, def_kind, None , & mut self . current_disambiguator )
744744 . def_id ( ) ;
745745
746746 debug ! ( "create_def: def_id_to_node_id[{:?}] <-> {:?}" , def_id, node_id) ;
@@ -780,9 +780,16 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
780780 f : impl FnOnce ( & mut Self ) -> hir:: OwnerNode < ' hir > ,
781781 ) {
782782 let owner_id = self . owner_id ( owner) ;
783+ let def_id = owner_id. def_id ;
784+
785+ let new_disambig = match & mut self . disambiguators {
786+ Disambiguators :: Default ( map) => map. remove ( & def_id) ,
787+ Disambiguators :: Delayed ( map) => map. get ( & def_id) . map ( Steal :: steal) ,
788+ } ;
789+
790+ let new_disambig = new_disambig. unwrap_or_else ( || PerParentDisambiguatorState :: new ( def_id) ) ;
783791
784- let new_disambig = self . resolver . steal_or_create_disambiguator ( owner_id. def_id ) ;
785- let disambiguator = std:: mem:: replace ( & mut self . disambiguator , new_disambig) ;
792+ let disambiguator = std:: mem:: replace ( & mut self . current_disambiguator , new_disambig) ;
786793 let current_attrs = std:: mem:: take ( & mut self . attrs ) ;
787794 let current_bodies = std:: mem:: take ( & mut self . bodies ) ;
788795 let current_define_opaque = std:: mem:: take ( & mut self . define_opaque ) ;
@@ -817,7 +824,7 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
817824 assert ! ( self . impl_trait_bounds. is_empty( ) ) ;
818825 let info = self . make_owner_info ( item) ;
819826
820- self . disambiguator = disambiguator;
827+ self . current_disambiguator = disambiguator;
821828 self . attrs = current_attrs;
822829 self . bodies = current_bodies;
823830 self . define_opaque = current_define_opaque;
0 commit comments