Refactor parse_expr_res
.
This removes the final `Option<AttrWrapper>` argument.
This commit is contained in:
parent
43eae4cef4
commit
8170acb197
5 changed files with 33 additions and 28 deletions
|
@ -2502,7 +2502,8 @@ impl<'a> Parser<'a> {
|
||||||
/// wrapped in braces.
|
/// wrapped in braces.
|
||||||
pub(super) fn handle_unambiguous_unbraced_const_arg(&mut self) -> PResult<'a, P<Expr>> {
|
pub(super) fn handle_unambiguous_unbraced_const_arg(&mut self) -> PResult<'a, P<Expr>> {
|
||||||
let start = self.token.span;
|
let start = self.token.span;
|
||||||
let expr = self.parse_expr_res(Restrictions::CONST_EXPR, None).map_err(|mut err| {
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
let expr = self.parse_expr_res(Restrictions::CONST_EXPR, attrs).map_err(|mut err| {
|
||||||
err.span_label(
|
err.span_label(
|
||||||
start.shrink_to_lo(),
|
start.shrink_to_lo(),
|
||||||
"while parsing a const generic argument starting here",
|
"while parsing a const generic argument starting here",
|
||||||
|
@ -2624,7 +2625,10 @@ impl<'a> Parser<'a> {
|
||||||
if is_op_or_dot {
|
if is_op_or_dot {
|
||||||
self.bump();
|
self.bump();
|
||||||
}
|
}
|
||||||
match self.parse_expr_res(Restrictions::CONST_EXPR, None) {
|
match (|| {
|
||||||
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
self.parse_expr_res(Restrictions::CONST_EXPR, attrs)
|
||||||
|
})() {
|
||||||
Ok(expr) => {
|
Ok(expr) => {
|
||||||
// Find a mistake like `MyTrait<Assoc == S::Assoc>`.
|
// Find a mistake like `MyTrait<Assoc == S::Assoc>`.
|
||||||
if token::EqEq == snapshot.token.kind {
|
if token::EqEq == snapshot.token.kind {
|
||||||
|
@ -2678,7 +2682,10 @@ impl<'a> Parser<'a> {
|
||||||
&mut self,
|
&mut self,
|
||||||
mut snapshot: SnapshotParser<'a>,
|
mut snapshot: SnapshotParser<'a>,
|
||||||
) -> Option<P<ast::Expr>> {
|
) -> Option<P<ast::Expr>> {
|
||||||
match snapshot.parse_expr_res(Restrictions::CONST_EXPR, None) {
|
match (|| {
|
||||||
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
snapshot.parse_expr_res(Restrictions::CONST_EXPR, attrs)
|
||||||
|
})() {
|
||||||
// Since we don't know the exact reason why we failed to parse the type or the
|
// Since we don't know the exact reason why we failed to parse the type or the
|
||||||
// expression, employ a simple heuristic to weed out some pathological cases.
|
// expression, employ a simple heuristic to weed out some pathological cases.
|
||||||
Ok(expr) if let token::Comma | token::Gt = snapshot.token.kind => {
|
Ok(expr) if let token::Comma | token::Gt = snapshot.token.kind => {
|
||||||
|
|
|
@ -94,7 +94,8 @@ impl<'a> Parser<'a> {
|
||||||
pub fn parse_expr(&mut self) -> PResult<'a, P<Expr>> {
|
pub fn parse_expr(&mut self) -> PResult<'a, P<Expr>> {
|
||||||
self.current_closure.take();
|
self.current_closure.take();
|
||||||
|
|
||||||
self.parse_expr_res(Restrictions::empty(), None)
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
self.parse_expr_res(Restrictions::empty(), attrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses an expression, forcing tokens to be collected
|
/// Parses an expression, forcing tokens to be collected
|
||||||
|
@ -107,7 +108,8 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_expr_catch_underscore(&mut self, restrictions: Restrictions) -> PResult<'a, P<Expr>> {
|
fn parse_expr_catch_underscore(&mut self, restrictions: Restrictions) -> PResult<'a, P<Expr>> {
|
||||||
match self.parse_expr_res(restrictions, None) {
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
match self.parse_expr_res(restrictions, attrs) {
|
||||||
Ok(expr) => Ok(expr),
|
Ok(expr) => Ok(expr),
|
||||||
Err(err) => match self.token.ident() {
|
Err(err) => match self.token.ident() {
|
||||||
Some((Ident { name: kw::Underscore, .. }, IdentIsRaw::No))
|
Some((Ident { name: kw::Underscore, .. }, IdentIsRaw::No))
|
||||||
|
@ -134,9 +136,8 @@ impl<'a> Parser<'a> {
|
||||||
pub(super) fn parse_expr_res(
|
pub(super) fn parse_expr_res(
|
||||||
&mut self,
|
&mut self,
|
||||||
r: Restrictions,
|
r: Restrictions,
|
||||||
attrs: Option<AttrWrapper>,
|
attrs: AttrWrapper,
|
||||||
) -> PResult<'a, P<Expr>> {
|
) -> PResult<'a, P<Expr>> {
|
||||||
let attrs = self.parse_or_use_outer_attributes(attrs)?;
|
|
||||||
self.with_res(r, |this| this.parse_expr_assoc_with(0, LhsExpr::Unparsed { attrs }))
|
self.with_res(r, |this| this.parse_expr_assoc_with(0, LhsExpr::Unparsed { attrs }))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2343,7 +2344,8 @@ impl<'a> Parser<'a> {
|
||||||
self.restrictions - Restrictions::STMT_EXPR - Restrictions::ALLOW_LET;
|
self.restrictions - Restrictions::STMT_EXPR - Restrictions::ALLOW_LET;
|
||||||
let prev = self.prev_token.clone();
|
let prev = self.prev_token.clone();
|
||||||
let token = self.token.clone();
|
let token = self.token.clone();
|
||||||
match self.parse_expr_res(restrictions, None) {
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
match self.parse_expr_res(restrictions, attrs) {
|
||||||
Ok(expr) => expr,
|
Ok(expr) => expr,
|
||||||
Err(err) => self.recover_closure_body(err, before, prev, token, lo, decl_hi)?,
|
Err(err) => self.recover_closure_body(err, before, prev, token, lo, decl_hi)?,
|
||||||
}
|
}
|
||||||
|
@ -2591,8 +2593,9 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
/// Parses the condition of a `if` or `while` expression.
|
/// Parses the condition of a `if` or `while` expression.
|
||||||
fn parse_expr_cond(&mut self) -> PResult<'a, P<Expr>> {
|
fn parse_expr_cond(&mut self) -> PResult<'a, P<Expr>> {
|
||||||
|
let attrs = self.parse_outer_attributes()?;
|
||||||
let mut cond =
|
let mut cond =
|
||||||
self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL | Restrictions::ALLOW_LET, None)?;
|
self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL | Restrictions::ALLOW_LET, attrs)?;
|
||||||
|
|
||||||
CondChecker::new(self).visit_expr(&mut cond);
|
CondChecker::new(self).visit_expr(&mut cond);
|
||||||
|
|
||||||
|
@ -2776,7 +2779,8 @@ impl<'a> Parser<'a> {
|
||||||
(Err(err), Some((start_span, left))) if self.eat_keyword(kw::In) => {
|
(Err(err), Some((start_span, left))) if self.eat_keyword(kw::In) => {
|
||||||
// We know for sure we have seen `for ($SOMETHING in`. In the happy path this would
|
// We know for sure we have seen `for ($SOMETHING in`. In the happy path this would
|
||||||
// happen right before the return of this method.
|
// happen right before the return of this method.
|
||||||
let expr = match self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL, None) {
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
let expr = match self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL, attrs) {
|
||||||
Ok(expr) => expr,
|
Ok(expr) => expr,
|
||||||
Err(expr_err) => {
|
Err(expr_err) => {
|
||||||
// We don't know what followed the `in`, so cancel and bubble up the
|
// We don't know what followed the `in`, so cancel and bubble up the
|
||||||
|
@ -2810,7 +2814,8 @@ impl<'a> Parser<'a> {
|
||||||
self.error_missing_in_for_loop();
|
self.error_missing_in_for_loop();
|
||||||
}
|
}
|
||||||
self.check_for_for_in_in_typo(self.prev_token.span);
|
self.check_for_for_in_in_typo(self.prev_token.span);
|
||||||
let expr = self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL, None)?;
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
let expr = self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL, attrs)?;
|
||||||
Ok((pat, expr))
|
Ok((pat, expr))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2922,7 +2927,8 @@ impl<'a> Parser<'a> {
|
||||||
/// Parses a `match ... { ... }` expression (`match` token already eaten).
|
/// Parses a `match ... { ... }` expression (`match` token already eaten).
|
||||||
fn parse_expr_match(&mut self) -> PResult<'a, P<Expr>> {
|
fn parse_expr_match(&mut self) -> PResult<'a, P<Expr>> {
|
||||||
let match_span = self.prev_token.span;
|
let match_span = self.prev_token.span;
|
||||||
let scrutinee = self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL, None)?;
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
let scrutinee = self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL, attrs)?;
|
||||||
|
|
||||||
self.parse_match_block(match_span, match_span, scrutinee, MatchKind::Prefix)
|
self.parse_match_block(match_span, match_span, scrutinee, MatchKind::Prefix)
|
||||||
}
|
}
|
||||||
|
@ -3126,8 +3132,9 @@ impl<'a> Parser<'a> {
|
||||||
let arrow_span = this.prev_token.span;
|
let arrow_span = this.prev_token.span;
|
||||||
let arm_start_span = this.token.span;
|
let arm_start_span = this.token.span;
|
||||||
|
|
||||||
|
let attrs = this.parse_outer_attributes()?;
|
||||||
let expr =
|
let expr =
|
||||||
this.parse_expr_res(Restrictions::STMT_EXPR, None).map_err(|mut err| {
|
this.parse_expr_res(Restrictions::STMT_EXPR, attrs).map_err(|mut err| {
|
||||||
err.span_label(arrow_span, "while parsing the `match` arm starting here");
|
err.span_label(arrow_span, "while parsing the `match` arm starting here");
|
||||||
err
|
err
|
||||||
})?;
|
})?;
|
||||||
|
@ -3332,7 +3339,8 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_match_guard_condition(&mut self) -> PResult<'a, P<Expr>> {
|
fn parse_match_guard_condition(&mut self) -> PResult<'a, P<Expr>> {
|
||||||
self.parse_expr_res(Restrictions::ALLOW_LET | Restrictions::IN_IF_GUARD, None).map_err(
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
self.parse_expr_res(Restrictions::ALLOW_LET | Restrictions::IN_IF_GUARD, attrs).map_err(
|
||||||
|mut err| {
|
|mut err| {
|
||||||
if self.prev_token == token::OpenDelim(Delimiter::Brace) {
|
if self.prev_token == token::OpenDelim(Delimiter::Brace) {
|
||||||
let sugg_sp = self.prev_token.span.shrink_to_lo();
|
let sugg_sp = self.prev_token.span.shrink_to_lo();
|
||||||
|
|
|
@ -1337,17 +1337,6 @@ impl<'a> Parser<'a> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_or_use_outer_attributes(
|
|
||||||
&mut self,
|
|
||||||
already_parsed_attrs: Option<AttrWrapper>,
|
|
||||||
) -> PResult<'a, AttrWrapper> {
|
|
||||||
if let Some(attrs) = already_parsed_attrs {
|
|
||||||
Ok(attrs)
|
|
||||||
} else {
|
|
||||||
self.parse_outer_attributes()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Parses a single token tree from the input.
|
/// Parses a single token tree from the input.
|
||||||
pub fn parse_token_tree(&mut self) -> TokenTree {
|
pub fn parse_token_tree(&mut self) -> TokenTree {
|
||||||
match self.token.kind {
|
match self.token.kind {
|
||||||
|
|
|
@ -920,7 +920,8 @@ impl<'a> Parser<'a> {
|
||||||
// Fall back by trying to parse a const-expr expression. If we successfully do so,
|
// Fall back by trying to parse a const-expr expression. If we successfully do so,
|
||||||
// then we should report an error that it needs to be wrapped in braces.
|
// then we should report an error that it needs to be wrapped in braces.
|
||||||
let snapshot = self.create_snapshot_for_diagnostic();
|
let snapshot = self.create_snapshot_for_diagnostic();
|
||||||
match self.parse_expr_res(Restrictions::CONST_EXPR, None) {
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
match self.parse_expr_res(Restrictions::CONST_EXPR, attrs) {
|
||||||
Ok(expr) => {
|
Ok(expr) => {
|
||||||
return Ok(Some(self.dummy_const_arg_needs_braces(
|
return Ok(Some(self.dummy_const_arg_needs_braces(
|
||||||
self.dcx().struct_span_err(expr.span, "invalid const generic expression"),
|
self.dcx().struct_span_err(expr.span, "invalid const generic expression"),
|
||||||
|
|
|
@ -126,9 +126,9 @@ impl<'a> Parser<'a> {
|
||||||
// Remainder are line-expr stmts.
|
// Remainder are line-expr stmts.
|
||||||
let e = match force_collect {
|
let e = match force_collect {
|
||||||
ForceCollect::Yes => self.collect_tokens_no_attrs(|this| {
|
ForceCollect::Yes => self.collect_tokens_no_attrs(|this| {
|
||||||
this.parse_expr_res(Restrictions::STMT_EXPR, Some(attrs))
|
this.parse_expr_res(Restrictions::STMT_EXPR, attrs)
|
||||||
})?,
|
})?,
|
||||||
ForceCollect::No => self.parse_expr_res(Restrictions::STMT_EXPR, Some(attrs))?,
|
ForceCollect::No => self.parse_expr_res(Restrictions::STMT_EXPR, attrs)?,
|
||||||
};
|
};
|
||||||
if matches!(e.kind, ExprKind::Assign(..)) && self.eat_keyword(kw::Else) {
|
if matches!(e.kind, ExprKind::Assign(..)) && self.eat_keyword(kw::Else) {
|
||||||
let bl = self.parse_block()?;
|
let bl = self.parse_block()?;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue