diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs index 72a9311ee27..09563e68096 100644 --- a/src/librustc_parse/parser/expr.rs +++ b/src/librustc_parse/parser/expr.rs @@ -694,7 +694,6 @@ impl<'a> Parser<'a> { fn parse_dot_or_call_expr_with_(&mut self, e0: P, lo: Span) -> PResult<'a, P> { let mut e = e0; - let mut hi; loop { // expr? while self.eat(&token::Question) { @@ -766,23 +765,21 @@ impl<'a> Parser<'a> { }); e = self.recover_seq_parse_error(token::Paren, lo, seq); } - - // 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()) - } + token::OpenDelim(token::Bracket) => e = self.parse_index_expr(lo, e)?, _ => return Ok(e), } } return Ok(e); } + /// Parse an indexing expression `expr[...]`. + fn parse_index_expr(&mut self, lo: Span, base: P) -> PResult<'a, P> { + 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. fn parse_dot_suffix(&mut self, self_arg: P, lo: Span) -> PResult<'a, P> { 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)?; self.check_trailing_angle_brackets(&segment, token::OpenDelim(token::Paren)); - Ok(match self.token.kind { - token::OpenDelim(token::Paren) => { - // Method call `expr.f()` - let mut args = self.parse_paren_expr_seq()?; - args.insert(0, self_arg); + if self.check(&token::OpenDelim(token::Paren)) { + // Method call `expr.f()` + let mut args = self.parse_paren_expr_seq()?; + args.insert(0, self_arg); - let span = lo.to(self.prev_span); - self.mk_expr(span, ExprKind::MethodCall(segment, args), AttrVec::new()) + let span = lo.to(self.prev_span); + 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); - self.mk_expr(span, ExprKind::Field(self_arg, segment.ident), AttrVec::new()) - } - }) + let span = lo.to(self.prev_span); + Ok(self.mk_expr(span, ExprKind::Field(self_arg, segment.ident), AttrVec::new())) + } } /// At the bottom (top?) of the precedence hierarchy,