@@ -86,66 +86,71 @@ fn count_nodes(krate: &ast::Crate) -> usize {
8686 counter. count
8787}
8888
89- pub struct BoxedResolver ( Pin < Box < BoxedResolverInner > > ) ;
90-
91- // Note: Drop order is important to prevent dangling references. Resolver must be dropped first,
92- // then resolver_arenas and finally session.
93- // The drop order is defined to be from top to bottom in RFC1857, so there is no need for
94- // ManuallyDrop for as long as the fields are not reordered.
95- struct BoxedResolverInner {
96- resolver : Option < Resolver < ' static > > ,
97- resolver_arenas : ResolverArenas < ' static > ,
98- session : Lrc < Session > ,
99- _pin : PhantomPinned ,
100- }
89+ pub use boxed_resolver:: BoxedResolver ;
90+ mod boxed_resolver {
91+ use super :: * ;
92+
93+ pub struct BoxedResolver ( Pin < Box < BoxedResolverInner > > ) ;
94+
95+ // Note: Drop order is important to prevent dangling references. Resolver must be dropped first,
96+ // then resolver_arenas and finally session.
97+ // The drop order is defined to be from top to bottom in RFC1857, so there is no need for
98+ // ManuallyDrop for as long as the fields are not reordered.
99+ struct BoxedResolverInner {
100+ resolver : Option < Resolver < ' static > > ,
101+ resolver_arenas : ResolverArenas < ' static > ,
102+ session : Lrc < Session > ,
103+ _pin : PhantomPinned ,
104+ }
101105
102- impl BoxedResolver {
103- fn new < F > ( session : Lrc < Session > , make_resolver : F ) -> Result < ( ast:: Crate , Self ) >
104- where
105- F : for < ' a > FnOnce (
106- & ' a Session ,
107- & ' a ResolverArenas < ' a > ,
108- ) -> Result < ( ast:: Crate , Resolver < ' a > ) > ,
109- {
110- let mut boxed_resolver = Box :: new ( BoxedResolverInner {
111- session,
112- resolver_arenas : Resolver :: arenas ( ) ,
113- resolver : None ,
114- _pin : PhantomPinned ,
115- } ) ;
116- unsafe {
117- let ( crate_, resolver) = make_resolver (
118- std:: mem:: transmute :: < & Session , & Session > ( & boxed_resolver. session ) ,
119- std:: mem:: transmute :: < & ResolverArenas < ' _ > , & ResolverArenas < ' _ > > (
120- & boxed_resolver. resolver_arenas ,
121- ) ,
122- ) ?;
123- boxed_resolver. resolver =
124- Some ( std:: mem:: transmute :: < Resolver < ' _ > , Resolver < ' _ > > ( resolver) ) ;
125- Ok ( ( crate_, BoxedResolver ( Pin :: new_unchecked ( boxed_resolver) ) ) )
106+ impl BoxedResolver {
107+ pub ( super ) fn new < F > ( session : Lrc < Session > , make_resolver : F ) -> Result < ( ast:: Crate , Self ) >
108+ where
109+ F : for < ' a > FnOnce (
110+ & ' a Session ,
111+ & ' a ResolverArenas < ' a > ,
112+ ) -> Result < ( ast:: Crate , Resolver < ' a > ) > ,
113+ {
114+ let mut boxed_resolver = Box :: new ( BoxedResolverInner {
115+ session,
116+ resolver_arenas : Resolver :: arenas ( ) ,
117+ resolver : None ,
118+ _pin : PhantomPinned ,
119+ } ) ;
120+ unsafe {
121+ let ( crate_, resolver) = make_resolver (
122+ std:: mem:: transmute :: < & Session , & Session > ( & boxed_resolver. session ) ,
123+ std:: mem:: transmute :: < & ResolverArenas < ' _ > , & ResolverArenas < ' _ > > (
124+ & boxed_resolver. resolver_arenas ,
125+ ) ,
126+ ) ?;
127+ boxed_resolver. resolver =
128+ Some ( std:: mem:: transmute :: < Resolver < ' _ > , Resolver < ' _ > > ( resolver) ) ;
129+ Ok ( ( crate_, BoxedResolver ( Pin :: new_unchecked ( boxed_resolver) ) ) )
130+ }
126131 }
127- }
128132
129- pub fn access < F : for < ' a > FnOnce ( & mut Resolver < ' a > ) -> R , R > ( & mut self , f : F ) -> R {
130- let mut resolver = unsafe {
131- self . 0 . as_mut ( ) . map_unchecked_mut ( |boxed_resolver| & mut boxed_resolver. resolver )
132- } ;
133- f ( ( & mut * resolver) . as_mut ( ) . unwrap ( ) )
134- }
133+ pub fn access < F : for < ' a > FnOnce ( & mut Resolver < ' a > ) -> R , R > ( & mut self , f : F ) -> R {
134+ let mut resolver = unsafe {
135+ self . 0 . as_mut ( ) . map_unchecked_mut ( |boxed_resolver| & mut boxed_resolver. resolver )
136+ } ;
137+ f ( ( & mut * resolver) . as_mut ( ) . unwrap ( ) )
138+ }
135139
136- pub fn to_resolver_outputs ( resolver : Rc < RefCell < BoxedResolver > > ) -> ResolverOutputs {
137- match Rc :: try_unwrap ( resolver) {
138- Ok ( resolver) => {
139- let mut resolver = resolver. into_inner ( ) ;
140- let mut resolver = unsafe {
141- resolver
142- . 0
143- . as_mut ( )
144- . map_unchecked_mut ( |boxed_resolver| & mut boxed_resolver. resolver )
145- } ;
146- resolver. take ( ) . unwrap ( ) . into_outputs ( )
140+ pub fn to_resolver_outputs ( resolver : Rc < RefCell < BoxedResolver > > ) -> ResolverOutputs {
141+ match Rc :: try_unwrap ( resolver) {
142+ Ok ( resolver) => {
143+ let mut resolver = resolver. into_inner ( ) ;
144+ let mut resolver = unsafe {
145+ resolver
146+ . 0
147+ . as_mut ( )
148+ . map_unchecked_mut ( |boxed_resolver| & mut boxed_resolver. resolver )
149+ } ;
150+ resolver. take ( ) . unwrap ( ) . into_outputs ( )
151+ }
152+ Err ( resolver) => resolver. borrow_mut ( ) . access ( |resolver| resolver. clone_outputs ( ) ) ,
147153 }
148- Err ( resolver) => resolver. borrow_mut ( ) . access ( |resolver| resolver. clone_outputs ( ) ) ,
149154 }
150155 }
151156}
0 commit comments