@@ -414,6 +414,52 @@ impl<I: Tokens> Buffer<I> {
414414 } ) ;
415415 }
416416
417+ pub fn merge_lt_gt ( & mut self ) {
418+ debug_assert ! (
419+ self . is( & tok!( '<' ) ) || self . is( & tok!( '>' ) ) ,
420+ "parser should only call merge_lt_gt when encountering '<' or '>' token"
421+ ) ;
422+
423+ let span = self . cur_span ( ) ;
424+
425+ if self . peek ( ) . is_none ( ) {
426+ return ;
427+ }
428+
429+ let next = self . next . as_ref ( ) . unwrap ( ) ;
430+
431+ if span. hi != next. span . lo {
432+ return ;
433+ }
434+
435+ let cur = self . cur . take ( ) . unwrap ( ) ;
436+ let next = self . next . take ( ) . unwrap ( ) ;
437+
438+ let token = match ( & cur. token , & next. token ) {
439+ ( tok ! ( '>' ) , tok ! ( '>' ) ) => tok ! ( ">>" ) ,
440+ ( tok ! ( '>' ) , tok ! ( '=' ) ) => tok ! ( ">=" ) ,
441+ ( tok ! ( '>' ) , tok ! ( ">>" ) ) => tok ! ( ">>>" ) ,
442+ ( tok ! ( '>' ) , tok ! ( ">=" ) ) => tok ! ( ">>=" ) ,
443+ ( tok ! ( '>' ) , tok ! ( ">>=" ) ) => tok ! ( ">>>=" ) ,
444+ ( tok ! ( '<' ) , tok ! ( '<' ) ) => tok ! ( "<<" ) ,
445+ ( tok ! ( '<' ) , tok ! ( '=' ) ) => tok ! ( "<=" ) ,
446+ ( tok ! ( '<' ) , tok ! ( "<=" ) ) => tok ! ( "<<=" ) ,
447+
448+ _ => {
449+ self . cur = Some ( cur) ;
450+ self . next = Some ( next) ;
451+ return ;
452+ }
453+ } ;
454+ let span = span. with_hi ( next. span . hi ) ;
455+
456+ self . cur = Some ( TokenAndSpan {
457+ token,
458+ span,
459+ had_line_break : cur. had_line_break ,
460+ } ) ;
461+ }
462+
417463 #[ inline]
418464 pub fn is ( & mut self , expected : & Token ) -> bool {
419465 match self . cur ( ) {
0 commit comments