@@ -87,7 +87,10 @@ pub struct LoweringContext<'a> {
8787
8888 resolver : & ' a mut dyn Resolver ,
8989
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 ,
9194
9295 /// The items being lowered are collected here.
9396 items : BTreeMap < hir:: HirId , hir:: Item > ,
@@ -183,12 +186,7 @@ pub trait Resolver {
183186 fn has_derives ( & self , node_id : NodeId , derives : SpecialDerives ) -> bool ;
184187}
185188
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 ;
192190
193191/// Context of `impl Trait` in code, which determines whether it is allowed in an HIR subtree,
194192/// and if so, what meaning it has.
@@ -246,7 +244,7 @@ pub fn lower_crate(
246244 dep_graph : & DepGraph ,
247245 krate : & Crate ,
248246 resolver : & mut dyn Resolver ,
249- parser : & ' static dyn Parser ,
247+ nt_to_tokenstream : NtToTokenstream ,
250248) -> hir:: Crate {
251249 // We're constructing the HIR here; we don't care what we will
252250 // read, since we haven't even constructed the *input* to
@@ -260,7 +258,7 @@ pub fn lower_crate(
260258 sess,
261259 cstore,
262260 resolver,
263- parser ,
261+ nt_to_tokenstream ,
264262 items : BTreeMap :: new ( ) ,
265263 trait_items : BTreeMap :: new ( ) ,
266264 impl_items : BTreeMap :: new ( ) ,
@@ -1034,7 +1032,7 @@ impl<'a> LoweringContext<'a> {
10341032 fn lower_token ( & mut self , token : Token ) -> TokenStream {
10351033 match token. kind {
10361034 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 ) ;
10381036 self . lower_token_stream ( tts)
10391037 }
10401038 _ => TokenTree :: Token ( token) . into ( ) ,
0 commit comments