extract parse_index_expr & refactor parse_dot_suffix
This commit is contained in:
parent
0bb3dad5a6
commit
98701b2c61
1 changed files with 22 additions and 28 deletions
|
@ -694,7 +694,6 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
fn parse_dot_or_call_expr_with_(&mut self, e0: P<Expr>, lo: Span) -> PResult<'a, P<Expr>> {
|
fn parse_dot_or_call_expr_with_(&mut self, e0: P<Expr>, lo: Span) -> PResult<'a, P<Expr>> {
|
||||||
let mut e = e0;
|
let mut e = e0;
|
||||||
let mut hi;
|
|
||||||
loop {
|
loop {
|
||||||
// expr?
|
// expr?
|
||||||
while self.eat(&token::Question) {
|
while self.eat(&token::Question) {
|
||||||
|
@ -766,23 +765,21 @@ impl<'a> Parser<'a> {
|
||||||
});
|
});
|
||||||
e = self.recover_seq_parse_error(token::Paren, lo, seq);
|
e = self.recover_seq_parse_error(token::Paren, lo, seq);
|
||||||
}
|
}
|
||||||
|
token::OpenDelim(token::Bracket) => e = self.parse_index_expr(lo, e)?,
|
||||||
// expr[...]
|
|
||||||
// Could be either an index expression or a slicing expression.
|
|
||||||
token::OpenDelim(token::Bracket) => {
|
|
||||||
self.bump();
|
|
||||||
let ix = self.parse_expr()?;
|
|
||||||
hi = self.token.span;
|
|
||||||
self.expect(&token::CloseDelim(token::Bracket))?;
|
|
||||||
let index = self.mk_index(e, ix);
|
|
||||||
e = self.mk_expr(lo.to(hi), index, AttrVec::new())
|
|
||||||
}
|
|
||||||
_ => return Ok(e),
|
_ => return Ok(e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Ok(e);
|
return Ok(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parse an indexing expression `expr[...]`.
|
||||||
|
fn parse_index_expr(&mut self, lo: Span, base: P<Expr>) -> PResult<'a, P<Expr>> {
|
||||||
|
self.bump(); // `[`
|
||||||
|
let index = self.parse_expr()?;
|
||||||
|
self.expect(&token::CloseDelim(token::Bracket))?;
|
||||||
|
Ok(self.mk_expr(lo.to(self.prev_span), self.mk_index(base, index), AttrVec::new()))
|
||||||
|
}
|
||||||
|
|
||||||
/// Assuming we have just parsed `.`, continue parsing into an expression.
|
/// Assuming we have just parsed `.`, continue parsing into an expression.
|
||||||
fn parse_dot_suffix(&mut self, self_arg: P<Expr>, lo: Span) -> PResult<'a, P<Expr>> {
|
fn parse_dot_suffix(&mut self, self_arg: P<Expr>, lo: Span) -> PResult<'a, P<Expr>> {
|
||||||
if self.token.span.rust_2018() && self.eat_keyword(kw::Await) {
|
if self.token.span.rust_2018() && self.eat_keyword(kw::Await) {
|
||||||
|
@ -792,25 +789,22 @@ impl<'a> Parser<'a> {
|
||||||
let segment = self.parse_path_segment(PathStyle::Expr)?;
|
let segment = self.parse_path_segment(PathStyle::Expr)?;
|
||||||
self.check_trailing_angle_brackets(&segment, token::OpenDelim(token::Paren));
|
self.check_trailing_angle_brackets(&segment, token::OpenDelim(token::Paren));
|
||||||
|
|
||||||
Ok(match self.token.kind {
|
if self.check(&token::OpenDelim(token::Paren)) {
|
||||||
token::OpenDelim(token::Paren) => {
|
// Method call `expr.f()`
|
||||||
// Method call `expr.f()`
|
let mut args = self.parse_paren_expr_seq()?;
|
||||||
let mut args = self.parse_paren_expr_seq()?;
|
args.insert(0, self_arg);
|
||||||
args.insert(0, self_arg);
|
|
||||||
|
|
||||||
let span = lo.to(self.prev_span);
|
let span = lo.to(self.prev_span);
|
||||||
self.mk_expr(span, ExprKind::MethodCall(segment, args), AttrVec::new())
|
Ok(self.mk_expr(span, ExprKind::MethodCall(segment, args), AttrVec::new()))
|
||||||
|
} else {
|
||||||
|
// Field access `expr.f`
|
||||||
|
if let Some(args) = segment.args {
|
||||||
|
self.span_err(args.span(), "field expressions may not have generic arguments");
|
||||||
}
|
}
|
||||||
_ => {
|
|
||||||
// Field access `expr.f`
|
|
||||||
if let Some(args) = segment.args {
|
|
||||||
self.span_err(args.span(), "field expressions may not have generic arguments");
|
|
||||||
}
|
|
||||||
|
|
||||||
let span = lo.to(self.prev_span);
|
let span = lo.to(self.prev_span);
|
||||||
self.mk_expr(span, ExprKind::Field(self_arg, segment.ident), AttrVec::new())
|
Ok(self.mk_expr(span, ExprKind::Field(self_arg, segment.ident), AttrVec::new()))
|
||||||
}
|
}
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// At the bottom (top?) of the precedence hierarchy,
|
/// At the bottom (top?) of the precedence hierarchy,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue