@@ -481,6 +481,12 @@ fn dummy_arg(span: Span) -> Arg {
481
481
Arg { ty : P ( ty) , pat : pat, id : ast:: DUMMY_NODE_ID }
482
482
}
483
483
484
+ #[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
485
+ enum TokenExpectType {
486
+ Expect ,
487
+ NoExpect ,
488
+ }
489
+
484
490
impl < ' a > Parser < ' a > {
485
491
pub fn new ( sess : & ' a ParseSess ,
486
492
tokens : TokenStream ,
@@ -797,6 +803,23 @@ impl<'a> Parser<'a> {
797
803
}
798
804
}
799
805
806
+ /// Expect and consume an `|`. If `||` is seen, replace it with a single
807
+ /// `|` and continue. If an `|` is not seen, signal an error.
808
+ fn expect_or ( & mut self ) -> PResult < ' a , ( ) > {
809
+ self . expected_tokens . push ( TokenType :: Token ( token:: BinOp ( token:: Or ) ) ) ;
810
+ match self . token {
811
+ token:: BinOp ( token:: Or ) => {
812
+ self . bump ( ) ;
813
+ Ok ( ( ) )
814
+ }
815
+ token:: OrOr => {
816
+ let span = self . span . with_lo ( self . span . lo ( ) + BytePos ( 1 ) ) ;
817
+ Ok ( self . bump_with ( token:: BinOp ( token:: Or ) , span) )
818
+ }
819
+ _ => self . unexpected ( )
820
+ }
821
+ }
822
+
800
823
pub fn expect_no_suffix ( & self , sp : Span , kind : & str , suffix : Option < ast:: Name > ) {
801
824
match suffix {
802
825
None => { /* everything ok */ }
@@ -946,6 +969,7 @@ impl<'a> Parser<'a> {
946
969
947
970
self . parse_seq_to_before_tokens ( kets,
948
971
SeqSep :: none ( ) ,
972
+ TokenExpectType :: Expect ,
949
973
|p| Ok ( p. parse_token_tree ( ) ) ,
950
974
|mut e| handler. cancel ( & mut e) ) ;
951
975
}
@@ -975,13 +999,14 @@ impl<'a> Parser<'a> {
975
999
-> Vec < T >
976
1000
where F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T >
977
1001
{
978
- self . parse_seq_to_before_tokens ( & [ ket] , sep, f, |mut e| e. emit ( ) )
1002
+ self . parse_seq_to_before_tokens ( & [ ket] , sep, TokenExpectType :: Expect , f, |mut e| e. emit ( ) )
979
1003
}
980
1004
981
1005
// `fe` is an error handler.
982
1006
fn parse_seq_to_before_tokens < T , F , Fe > ( & mut self ,
983
1007
kets : & [ & token:: Token ] ,
984
1008
sep : SeqSep ,
1009
+ expect : TokenExpectType ,
985
1010
mut f : F ,
986
1011
mut fe : Fe )
987
1012
-> Vec < T >
@@ -1005,7 +1030,12 @@ impl<'a> Parser<'a> {
1005
1030
}
1006
1031
}
1007
1032
}
1008
- if sep. trailing_sep_allowed && kets. iter ( ) . any ( |k| self . check ( k) ) {
1033
+ if sep. trailing_sep_allowed && kets. iter ( ) . any ( |k| {
1034
+ match expect {
1035
+ TokenExpectType :: Expect => self . check ( k) ,
1036
+ TokenExpectType :: NoExpect => self . token == * * k,
1037
+ }
1038
+ } ) {
1009
1039
break ;
1010
1040
}
1011
1041
@@ -4694,12 +4724,14 @@ impl<'a> Parser<'a> {
4694
4724
Vec :: new ( )
4695
4725
} else {
4696
4726
self . expect ( & token:: BinOp ( token:: Or ) ) ?;
4697
- let args = self . parse_seq_to_before_end (
4698
- & token:: BinOp ( token:: Or ) ,
4727
+ let args = self . parse_seq_to_before_tokens (
4728
+ & [ & token:: BinOp ( token:: Or ) , & token :: OrOr ] ,
4699
4729
SeqSep :: trailing_allowed ( token:: Comma ) ,
4700
- |p| p. parse_fn_block_arg ( )
4730
+ TokenExpectType :: NoExpect ,
4731
+ |p| p. parse_fn_block_arg ( ) ,
4732
+ |mut e| e. emit ( )
4701
4733
) ;
4702
- self . expect ( & token :: BinOp ( token :: Or ) ) ?;
4734
+ self . expect_or ( ) ?;
4703
4735
args
4704
4736
}
4705
4737
} ;
0 commit comments