@@ -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