@@ -87,7 +87,10 @@ pub struct LoweringContext<'a> {
87
87
88
88
resolver : & ' a mut dyn Resolver ,
89
89
90
- parser : & ' static dyn Parser ,
90
+ /// HACK(Centril): there is a cyclic dependency between the parser and lowering
91
+ /// if we don't have this function pointer. To avoid that dependency so that
92
+ /// librustc is independent of the parser, we use dynamic dispatch here.
93
+ nt_to_tokenstream : NtToTokenstream ,
91
94
92
95
/// The items being lowered are collected here.
93
96
items : BTreeMap < hir:: HirId , hir:: Item > ,
@@ -183,12 +186,7 @@ pub trait Resolver {
183
186
fn has_derives ( & self , node_id : NodeId , derives : SpecialDerives ) -> bool ;
184
187
}
185
188
186
- /// HACK(Centril): there is a cyclic dependency between the parser and lowering
187
- /// if we don't have this trait. To avoid that dependency so that librustc is
188
- /// independent of the parser, we use type erasure here.
189
- pub trait Parser {
190
- fn nt_to_tokenstream ( & self , nt : & Nonterminal , sess : & ParseSess , span : Span ) -> TokenStream ;
191
- }
189
+ type NtToTokenstream = fn ( & Nonterminal , & ParseSess , Span ) -> TokenStream ;
192
190
193
191
/// Context of `impl Trait` in code, which determines whether it is allowed in an HIR subtree,
194
192
/// and if so, what meaning it has.
@@ -246,7 +244,7 @@ pub fn lower_crate(
246
244
dep_graph : & DepGraph ,
247
245
krate : & Crate ,
248
246
resolver : & mut dyn Resolver ,
249
- parser : & ' static dyn Parser ,
247
+ nt_to_tokenstream : NtToTokenstream ,
250
248
) -> hir:: Crate {
251
249
// We're constructing the HIR here; we don't care what we will
252
250
// read, since we haven't even constructed the *input* to
@@ -260,7 +258,7 @@ pub fn lower_crate(
260
258
sess,
261
259
cstore,
262
260
resolver,
263
- parser ,
261
+ nt_to_tokenstream ,
264
262
items : BTreeMap :: new ( ) ,
265
263
trait_items : BTreeMap :: new ( ) ,
266
264
impl_items : BTreeMap :: new ( ) ,
@@ -1034,7 +1032,7 @@ impl<'a> LoweringContext<'a> {
1034
1032
fn lower_token ( & mut self , token : Token ) -> TokenStream {
1035
1033
match token. kind {
1036
1034
token:: Interpolated ( nt) => {
1037
- let tts = self . parser . nt_to_tokenstream ( & nt, & self . sess . parse_sess , token. span ) ;
1035
+ let tts = ( self . nt_to_tokenstream ) ( & nt, & self . sess . parse_sess , token. span ) ;
1038
1036
self . lower_token_stream ( tts)
1039
1037
}
1040
1038
_ => TokenTree :: Token ( token) . into ( ) ,
0 commit comments