simplify parse_prefix_range_expr
This commit is contained in:
parent
8456c403e1
commit
e43a7ef1d4
1 changed files with 17 additions and 22 deletions
|
@ -406,10 +406,7 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses prefix-forms of range notation: `..expr`, `..`, `..=expr`.
|
/// Parses prefix-forms of range notation: `..expr`, `..`, `..=expr`.
|
||||||
fn parse_prefix_range_expr(
|
fn parse_prefix_range_expr(&mut self, attrs: Option<AttrVec>) -> PResult<'a, P<Expr>> {
|
||||||
&mut self,
|
|
||||||
already_parsed_attrs: Option<AttrVec>,
|
|
||||||
) -> PResult<'a, P<Expr>> {
|
|
||||||
// Check for deprecated `...` syntax.
|
// Check for deprecated `...` syntax.
|
||||||
if self.token == token::DotDotDot {
|
if self.token == token::DotDotDot {
|
||||||
self.err_dotdotdot_syntax(self.token.span);
|
self.err_dotdotdot_syntax(self.token.span);
|
||||||
|
@ -420,25 +417,23 @@ impl<'a> Parser<'a> {
|
||||||
"parse_prefix_range_expr: token {:?} is not DotDot/DotDotEq",
|
"parse_prefix_range_expr: token {:?} is not DotDot/DotDotEq",
|
||||||
self.token
|
self.token
|
||||||
);
|
);
|
||||||
let tok = self.token.clone();
|
|
||||||
let attrs = self.parse_or_use_outer_attributes(already_parsed_attrs)?;
|
|
||||||
let lo = self.token.span;
|
|
||||||
let mut hi = self.token.span;
|
|
||||||
self.bump();
|
|
||||||
let opt_end = if self.is_at_start_of_range_notation_rhs() {
|
|
||||||
// RHS must be parsed with more associativity than the dots.
|
|
||||||
let next_prec = AssocOp::from_token(&tok).unwrap().precedence() + 1;
|
|
||||||
Some(self.parse_assoc_expr_with(next_prec, LhsExpr::NotYetParsed).map(|x| {
|
|
||||||
hi = x.span;
|
|
||||||
x
|
|
||||||
})?)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
let limits = if tok == token::DotDot { RangeLimits::HalfOpen } else { RangeLimits::Closed };
|
|
||||||
|
|
||||||
let r = self.mk_range(None, opt_end, limits)?;
|
let limits = match self.token.kind {
|
||||||
Ok(self.mk_expr(lo.to(hi), r, attrs))
|
token::DotDot => RangeLimits::HalfOpen,
|
||||||
|
_ => RangeLimits::Closed,
|
||||||
|
};
|
||||||
|
let op = AssocOp::from_token(&self.token);
|
||||||
|
let attrs = self.parse_or_use_outer_attributes(attrs)?;
|
||||||
|
let lo = self.token.span;
|
||||||
|
self.bump();
|
||||||
|
let (span, opt_end) = if self.is_at_start_of_range_notation_rhs() {
|
||||||
|
// RHS must be parsed with more associativity than the dots.
|
||||||
|
self.parse_assoc_expr_with(op.unwrap().precedence() + 1, LhsExpr::NotYetParsed)
|
||||||
|
.map(|x| (lo.to(x.span), Some(x)))?
|
||||||
|
} else {
|
||||||
|
(lo, None)
|
||||||
|
};
|
||||||
|
Ok(self.mk_expr(span, self.mk_range(None, opt_end, limits)?, attrs))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses a prefix-unary-operator expr.
|
/// Parses a prefix-unary-operator expr.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue