Skip to content

Commit 33421de

Browse files
committed
Cleanup parse_seq_* methods + record trailing separators.
1 parent 5c002ac commit 33421de

File tree

1 file changed

+35
-42
lines changed

1 file changed

+35
-42
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 35 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -888,14 +888,13 @@ impl<'a> Parser<'a> {
888888
/// Parses a sequence, including the closing delimiter. The function
889889
/// `f` must consume tokens until reaching the next separator or
890890
/// closing bracket.
891-
pub fn parse_seq_to_end<T, F>(&mut self,
892-
ket: &TokenKind,
893-
sep: SeqSep,
894-
f: F)
895-
-> PResult<'a, Vec<T>> where
896-
F: FnMut(&mut Parser<'a>) -> PResult<'a, T>,
897-
{
898-
let (val, recovered) = self.parse_seq_to_before_end(ket, sep, f)?;
891+
pub fn parse_seq_to_end<T>(
892+
&mut self,
893+
ket: &TokenKind,
894+
sep: SeqSep,
895+
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
896+
) -> PResult<'a, Vec<T>> {
897+
let (val, _, recovered) = self.parse_seq_to_before_end(ket, sep, f)?;
899898
if !recovered {
900899
self.bump();
901900
}
@@ -905,39 +904,39 @@ impl<'a> Parser<'a> {
905904
/// Parses a sequence, not including the closing delimiter. The function
906905
/// `f` must consume tokens until reaching the next separator or
907906
/// closing bracket.
908-
pub fn parse_seq_to_before_end<T, F>(
907+
pub fn parse_seq_to_before_end<T>(
909908
&mut self,
910909
ket: &TokenKind,
911910
sep: SeqSep,
912-
f: F,
913-
) -> PResult<'a, (Vec<T>, bool)>
914-
where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>
915-
{
911+
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
912+
) -> PResult<'a, (Vec<T>, bool, bool)> {
916913
self.parse_seq_to_before_tokens(&[ket], sep, TokenExpectType::Expect, f)
917914
}
918915

919-
crate fn parse_seq_to_before_tokens<T, F>(
916+
fn expect_any_with_type(&mut self, kets: &[&TokenKind], expect: TokenExpectType) -> bool {
917+
kets.iter().any(|k| {
918+
match expect {
919+
TokenExpectType::Expect => self.check(k),
920+
TokenExpectType::NoExpect => self.token == **k,
921+
}
922+
})
923+
}
924+
925+
crate fn parse_seq_to_before_tokens<T>(
920926
&mut self,
921927
kets: &[&TokenKind],
922928
sep: SeqSep,
923929
expect: TokenExpectType,
924-
mut f: F,
925-
) -> PResult<'a, (Vec<T>, bool /* recovered */)>
926-
where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>
927-
{
930+
mut f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
931+
) -> PResult<'a, (Vec<T>, bool /* trailing */, bool /* recovered */)> {
928932
let mut first = true;
929933
let mut recovered = false;
934+
let mut trailing = false;
930935
let mut v = vec![];
931-
while !kets.iter().any(|k| {
932-
match expect {
933-
TokenExpectType::Expect => self.check(k),
934-
TokenExpectType::NoExpect => self.token == **k,
935-
}
936-
}) {
937-
match self.token.kind {
938-
token::CloseDelim(..) | token::Eof => break,
939-
_ => {}
940-
};
936+
while !self.expect_any_with_type(kets, expect) {
937+
if let token::CloseDelim(..) | token::Eof = self.token.kind {
938+
break
939+
}
941940
if let Some(ref t) = sep.sep {
942941
if first {
943942
first = false;
@@ -971,40 +970,34 @@ impl<'a> Parser<'a> {
971970
}
972971
}
973972
}
974-
if sep.trailing_sep_allowed && kets.iter().any(|k| {
975-
match expect {
976-
TokenExpectType::Expect => self.check(k),
977-
TokenExpectType::NoExpect => self.token == **k,
978-
}
979-
}) {
973+
if sep.trailing_sep_allowed && self.expect_any_with_type(kets, expect) {
974+
trailing = true;
980975
break;
981976
}
982977

983978
let t = f(self)?;
984979
v.push(t);
985980
}
986981

987-
Ok((v, recovered))
982+
Ok((v, trailing, recovered))
988983
}
989984

990985
/// Parses a sequence, including the closing delimiter. The function
991986
/// `f` must consume tokens until reaching the next separator or
992987
/// closing bracket.
993-
fn parse_unspanned_seq<T, F>(
988+
fn parse_unspanned_seq<T>(
994989
&mut self,
995990
bra: &TokenKind,
996991
ket: &TokenKind,
997992
sep: SeqSep,
998-
f: F,
999-
) -> PResult<'a, Vec<T>> where
1000-
F: FnMut(&mut Parser<'a>) -> PResult<'a, T>,
1001-
{
993+
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
994+
) -> PResult<'a, (Vec<T>, bool)> {
1002995
self.expect(bra)?;
1003-
let (result, recovered) = self.parse_seq_to_before_end(ket, sep, f)?;
996+
let (result, trailing, recovered) = self.parse_seq_to_before_end(ket, sep, f)?;
1004997
if !recovered {
1005998
self.eat(ket);
1006999
}
1007-
Ok(result)
1000+
Ok((result, trailing))
10081001
}
10091002

10101003
/// Advance the parser by one token

0 commit comments

Comments
 (0)