@@ -253,15 +253,40 @@ where
253253 #[ inline( always) ]
254254 fn go < M : Mode > ( & self , inp : & mut InputRef < ' src , ' _ , I , E > ) -> PResult < M , O > {
255255 let before = inp. cursor ( ) ;
256- self . parser . go :: < Emit > ( inp) . and_then ( |out| {
257- if ( self . filter ) ( & out) {
258- Ok ( M :: bind ( || out) )
259- } else {
260- let err_span = inp. span_since ( & before) ;
261- inp. add_alt ( [ DefaultExpected :: SomethingElse ] , None , err_span) ;
256+ // Remove the pre-inner alt, to be reinserted later so we always preserve it
257+ let old_alt = inp. errors . alt . take ( ) ;
258+
259+ let res = self . parser . go :: < Emit > ( inp) ;
260+ let span = inp. span_since ( & before) ;
261+ let new_alt = inp. errors . alt . take ( ) ;
262+
263+ match res {
264+ Ok ( out) => {
265+ if ( self . filter ) ( & out) {
266+ // If successful, reinsert the original alt and then apply the new alt on top of it, since both are valid
267+ inp. errors . alt = old_alt;
268+ if let Some ( new_alt) = new_alt {
269+ inp. add_alt_err ( & new_alt. pos , new_alt. err ) ;
270+ }
271+ Ok ( M :: bind ( || out) )
272+ } else {
273+ // If unsuccessful, reinsert the original alt but replace the new alt with the "something else" error (since it overrides it)
274+ let expected = [ DefaultExpected :: SomethingElse ] ;
275+ let err = E :: Error :: expected_found ( expected, None , span) ;
276+ inp. errors . alt = old_alt;
277+ inp. add_alt_err ( & before. inner , err) ;
278+ Err ( ( ) )
279+ }
280+ }
281+
282+ Err ( _) => {
283+ inp. errors . alt = old_alt;
284+ if let Some ( new_alt) = new_alt {
285+ inp. add_alt_err ( & new_alt. pos , new_alt. err ) ;
286+ }
262287 Err ( ( ) )
263288 }
264- } )
289+ }
265290 }
266291
267292 go_extra ! ( O ) ;
0 commit comments