@@ -86,66 +86,71 @@ fn count_nodes(krate: &ast::Crate) -> usize {
86
86
counter. count
87
87
}
88
88
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
+ }
101
105
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
+ }
126
131
}
127
- }
128
132
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
+ }
135
139
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 ( ) ) ,
147
153
}
148
- Err ( resolver) => resolver. borrow_mut ( ) . access ( |resolver| resolver. clone_outputs ( ) ) ,
149
154
}
150
155
}
151
156
}
0 commit comments