@@ -221,24 +221,23 @@ pub trait ParseTreeVisitor<'input, Node: ParserNodeType<'input>>:
221221 fn visit_children ( & mut self , node : & Node :: Type ) { self . visit_children_inner ( node) }
222222}
223223
224- /// How visitor is supposed to visit children
224+ /// Workaround for default recursive children visiting
225225///
226- /// Default implementation visits children recursively
227- /// To override it you would need to enable specialization feature
228- ///
229- /// It is already implemented for visitors that are bound by `'input`.
226+ /// Already blanket implemented for all visitors.
227+ /// To override it you would need to implement `ParseTreeVisitor::visit_children`
230228pub trait VisitChildren < ' input , Node : ParserNodeType < ' input > > {
231229 fn visit_children_inner ( & mut self , node : & Node :: Type ) ;
232230}
233231
234232impl < ' input , Node , T > VisitChildren < ' input , Node > for T
235233where
236234 Node : ParserNodeType < ' input > ,
237- T : ParseTreeVisitor < ' input , Node > ,
238- for < ' a > & ' a mut Self : CoerceUnsized < & ' a mut Node :: Visitor > ,
239- Node :: Type : Visitable < Node :: Visitor > ,
235+ T : ParseTreeVisitor < ' input , Node > + ? Sized ,
236+ // for<'a> &'a mut Self: CoerceUnsized<&'a mut Node::Visitor>,
237+ Node :: Type : VisitableDyn < T > ,
240238{
241- default fn visit_children_inner ( & mut self , node : & Node :: Type ) { node. accept_children ( self ) }
239+ #[ inline( always) ]
240+ fn visit_children_inner ( & mut self , node : & Node :: Type ) { node. accept_children ( self ) }
242241}
243242
244243pub trait Visitable < Vis : ?Sized > {
@@ -247,6 +246,12 @@ pub trait Visitable<Vis: ?Sized> {
247246 }
248247}
249248
249+ pub trait VisitableDyn < Vis : ?Sized > {
250+ fn accept_dyn ( & self , visitor : & mut Vis ) {
251+ unreachable ! ( "should have been properly implemented by generated context when reachable" )
252+ }
253+ }
254+
250255pub trait ParseTreeListener < ' input , Node : ParserNodeType < ' input > > {
251256 fn visit_terminal ( & mut self , _node : & TerminalNode < ' input , Node > ) { }
252257 fn visit_error_node ( & mut self , _node : & ErrorNode < ' input , Node > ) { }
@@ -279,9 +284,6 @@ where
279284 T : ParseTreeListener < ' input , Node > + ' a + ?Sized ,
280285 Node :: Type : Listenable < T > ,
281286{
282- // #[doc(hidden)]
283- // pub fn new() -> Self{ Self(PhantomData) }
284-
285287 pub fn walk < Listener , Ctx > ( mut listener : Box < Listener > , t : & Ctx ) -> Box < Listener >
286288 where
287289 for < ' x > & ' x mut Listener : CoerceUnsized < & ' x mut T > ,
0 commit comments