@@ -31,7 +31,8 @@ use rustc_ast::{
31
31
use rustc_ast_pretty:: pprust;
32
32
use rustc_data_structures:: fx:: FxHashSet ;
33
33
use rustc_errors:: {
34
- fluent, Applicability , DiagnosticBuilder , DiagnosticMessage , Handler , MultiSpan , PResult ,
34
+ fluent, Applicability , DiagnosticBuilder , DiagnosticMessage , FatalError , Handler , MultiSpan ,
35
+ PResult ,
35
36
} ;
36
37
use rustc_errors:: { pluralize, Diagnostic , ErrorGuaranteed , IntoDiagnostic } ;
37
38
use rustc_session:: errors:: ExprParenthesesNeeded ;
@@ -2556,6 +2557,57 @@ impl<'a> Parser<'a> {
2556
2557
Ok ( ( ) )
2557
2558
}
2558
2559
2560
+ pub fn is_diff_marker ( & mut self , long_kind : & TokenKind , short_kind : & TokenKind ) -> bool {
2561
+ ( 0 ..3 ) . all ( |i| self . look_ahead ( i, |tok| tok == long_kind) )
2562
+ && self . look_ahead ( 3 , |tok| tok == short_kind)
2563
+ }
2564
+
2565
+ fn diff_marker ( & mut self , long_kind : & TokenKind , short_kind : & TokenKind ) -> Option < Span > {
2566
+ if self . is_diff_marker ( long_kind, short_kind) {
2567
+ let lo = self . token . span ;
2568
+ for _ in 0 ..4 {
2569
+ self . bump ( ) ;
2570
+ }
2571
+ return Some ( lo. to ( self . prev_token . span ) ) ;
2572
+ }
2573
+ None
2574
+ }
2575
+
2576
+ pub fn recover_diff_marker ( & mut self ) {
2577
+ let Some ( start) = self . diff_marker ( & TokenKind :: BinOp ( token:: Shl ) , & TokenKind :: Lt ) else {
2578
+ return ;
2579
+ } ;
2580
+ let mut spans = Vec :: with_capacity ( 3 ) ;
2581
+ spans. push ( start) ;
2582
+ let mut middle = None ;
2583
+ let mut end = None ;
2584
+ loop {
2585
+ if self . token . kind == TokenKind :: Eof {
2586
+ break ;
2587
+ }
2588
+ if let Some ( span) = self . diff_marker ( & TokenKind :: EqEq , & TokenKind :: Eq ) {
2589
+ spans. push ( span) ;
2590
+ middle = Some ( span) ;
2591
+ }
2592
+ if let Some ( span) = self . diff_marker ( & TokenKind :: BinOp ( token:: Shr ) , & TokenKind :: Gt ) {
2593
+ spans. push ( span) ;
2594
+ end = Some ( span) ;
2595
+ break ;
2596
+ }
2597
+ self . bump ( ) ;
2598
+ }
2599
+ let mut err = self . struct_span_err ( spans, "encountered diff marker" ) ;
2600
+ err. span_label ( start, "start" ) ;
2601
+ if let Some ( middle) = middle {
2602
+ err. span_label ( middle, "middle" ) ;
2603
+ }
2604
+ if let Some ( end) = end {
2605
+ err. span_label ( end, "end" ) ;
2606
+ }
2607
+ err. emit ( ) ;
2608
+ FatalError . raise ( )
2609
+ }
2610
+
2559
2611
/// Parse and throw away a parenthesized comma separated
2560
2612
/// sequence of patterns until `)` is reached.
2561
2613
fn skip_pat_list ( & mut self ) -> PResult < ' a , ( ) > {
0 commit comments