1
Fork 0

Remove Token::get_close_delimiter

We can simplify these usages due to the new delimiter representation. `Parser::expect_open_delim` has been added for convenience.
This commit is contained in:
Brendan Zabarauskas 2014-10-30 01:47:53 +11:00
parent 936d999b52
commit 1ab50f3600
2 changed files with 33 additions and 58 deletions

View file

@ -2013,6 +2013,16 @@ impl<'a> Parser<'a> {
}) })
} }
fn expect_open_delim(&mut self) -> token::DelimToken {
match self.token {
token::OpenDelim(delim) => {
self.bump();
delim
},
_ => self.fatal("expected open delimiter"),
}
}
/// At the bottom (top?) of the precedence hierarchy, /// At the bottom (top?) of the precedence hierarchy,
/// parse things like parenthesized exprs, /// parse things like parenthesized exprs,
/// macros, return, etc. /// macros, return, etc.
@ -2209,14 +2219,9 @@ impl<'a> Parser<'a> {
// MACRO INVOCATION expression // MACRO INVOCATION expression
self.bump(); self.bump();
let ket = self.token.get_close_delimiter() let delim = self.expect_open_delim();
.unwrap_or_else(|| {
self.fatal("expected open delimiter")
});
self.bump();
let tts = self.parse_seq_to_end( let tts = self.parse_seq_to_end(
&ket, &token::CloseDelim(delim),
seq_sep_none(), seq_sep_none(),
|p| p.parse_token_tree()); |p| p.parse_token_tree());
let hi = self.span.hi; let hi = self.span.hi;
@ -2624,13 +2629,8 @@ impl<'a> Parser<'a> {
// the interpolation of Matcher's // the interpolation of Matcher's
maybe_whole!(self, NtMatchers); maybe_whole!(self, NtMatchers);
let mut name_idx = 0u; let mut name_idx = 0u;
match self.token.get_close_delimiter() { let delim = self.expect_open_delim();
Some(other_delimiter) => { self.parse_matcher_subseq_upto(&mut name_idx, &token::CloseDelim(delim))
self.bump();
self.parse_matcher_subseq_upto(&mut name_idx, &other_delimiter)
}
None => self.fatal("expected open delimiter")
}
} }
/// This goofy function is necessary to correctly match parens in Matcher's. /// This goofy function is necessary to correctly match parens in Matcher's.
@ -3325,11 +3325,8 @@ impl<'a> Parser<'a> {
let pth1 = codemap::Spanned{span:id_span, node: id}; let pth1 = codemap::Spanned{span:id_span, node: id};
if self.eat(&token::Not) { if self.eat(&token::Not) {
// macro invocation // macro invocation
let ket = self.token.get_close_delimiter() let delim = self.expect_open_delim();
.unwrap_or_else(|| self.fatal("expected open delimiter")); let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
self.bump();
let tts = self.parse_seq_to_end(&ket,
seq_sep_none(), seq_sep_none(),
|p| p.parse_token_tree()); |p| p.parse_token_tree());
@ -3545,18 +3542,17 @@ impl<'a> Parser<'a> {
let pth = self.parse_path(NoTypesAllowed).path; let pth = self.parse_path(NoTypesAllowed).path;
self.bump(); self.bump();
let id = if self.token.get_close_delimiter().is_some() { let id = match self.token {
token::special_idents::invalid // no special identifier token::OpenDelim(_) => token::special_idents::invalid, // no special identifier
} else { _ => self.parse_ident(),
self.parse_ident()
}; };
// check that we're pointing at delimiters (need to check // check that we're pointing at delimiters (need to check
// again after the `if`, because of `parse_ident` // again after the `if`, because of `parse_ident`
// consuming more tokens). // consuming more tokens).
let (bra, ket) = match self.token.get_close_delimiter() { let delim = match self.token {
Some(ket) => (self.token.clone(), ket), token::OpenDelim(delim) => delim,
None => { _ => {
// we only expect an ident if we didn't parse one // we only expect an ident if we didn't parse one
// above. // above.
let ident_str = if id.name == token::special_idents::invalid.name { let ident_str = if id.name == token::special_idents::invalid.name {
@ -3568,12 +3564,12 @@ impl<'a> Parser<'a> {
self.fatal(format!("expected {}`(` or `{{`, found `{}`", self.fatal(format!("expected {}`(` or `{{`, found `{}`",
ident_str, ident_str,
tok_str).as_slice()) tok_str).as_slice())
} },
}; };
let tts = self.parse_unspanned_seq( let tts = self.parse_unspanned_seq(
&bra, &token::OpenDelim(delim),
&ket, &token::CloseDelim(delim),
seq_sep_none(), seq_sep_none(),
|p| p.parse_token_tree() |p| p.parse_token_tree()
); );
@ -4414,15 +4410,10 @@ impl<'a> Parser<'a> {
self.expect(&token::Not); self.expect(&token::Not);
// eat a matched-delimiter token tree: // eat a matched-delimiter token tree:
let tts = match self.token.get_close_delimiter() { let delim = self.expect_open_delim();
Some(ket) => { let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
self.bump(); seq_sep_none(),
self.parse_seq_to_end(&ket, |p| p.parse_token_tree());
seq_sep_none(),
|p| p.parse_token_tree())
}
None => self.fatal("expected open delimiter")
};
let m_ = ast::MacInvocTT(pth, tts, EMPTY_CTXT); let m_ = ast::MacInvocTT(pth, tts, EMPTY_CTXT);
let m: ast::Mac = codemap::Spanned { node: m_, let m: ast::Mac = codemap::Spanned { node: m_,
span: mk_sp(self.span.lo, span: mk_sp(self.span.lo,
@ -5505,15 +5496,10 @@ impl<'a> Parser<'a> {
token::special_idents::invalid // no special identifier token::special_idents::invalid // no special identifier
}; };
// eat a matched-delimiter token tree: // eat a matched-delimiter token tree:
let tts = match self.token.get_close_delimiter() { let delim = self.expect_open_delim();
Some(ket) => { let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
self.bump(); seq_sep_none(),
self.parse_seq_to_end(&ket, |p| p.parse_token_tree());
seq_sep_none(),
|p| p.parse_token_tree())
}
None => self.fatal("expected open delimiter")
};
// single-variant-enum... : // single-variant-enum... :
let m = ast::MacInvocTT(pth, tts, EMPTY_CTXT); let m = ast::MacInvocTT(pth, tts, EMPTY_CTXT);
let m: ast::Mac = codemap::Spanned { node: m, let m: ast::Mac = codemap::Spanned { node: m,

View file

@ -230,17 +230,6 @@ impl Token {
} }
} }
/// Returns the matching close delimiter if this is an open delimiter,
/// otherwise `None`.
pub fn get_close_delimiter(&self) -> Option<Token> {
match *self {
OpenDelim(Paren) => Some(CloseDelim(Paren)),
OpenDelim(Brace) => Some(CloseDelim(Brace)),
OpenDelim(Bracket) => Some(CloseDelim(Bracket)),
_ => None,
}
}
/// Returns `true` if the token is any literal /// Returns `true` if the token is any literal
pub fn is_lit(&self) -> bool { pub fn is_lit(&self) -> bool {
match *self { match *self {