Overhaul token collection.
This commit does the following. - Renames `collect_tokens_trailing_token` as `collect_tokens`, because (a) it's annoying long, and (b) the `_trailing_token` bit is less accurate now that its types have changed. - In `collect_tokens`, adds a `Option<CollectPos>` argument and a `UsePreAttrPos` in the return type of `f`. These are used in `parse_expr_force_collect` (for vanilla expressions) and in `parse_stmt_without_recovery` (for two different cases of expression statements). Together these ensure are enough to fix all the problems with token collection and assoc expressions. The changes to the `stringify.rs` test demonstrate some of these. - Adds a new test. The code in this test was causing an assertion failure prior to this commit, due to an invalid `NodeRange`. The extra complexity is annoying, but necessary to fix the existing problems.
This commit is contained in:
parent
fe460ac28b
commit
9d31f86f0d
12 changed files with 414 additions and 292 deletions
|
@ -2487,13 +2487,14 @@ impl<'a> Parser<'a> {
|
|||
pub(super) fn handle_unambiguous_unbraced_const_arg(&mut self) -> PResult<'a, P<Expr>> {
|
||||
let start = self.token.span;
|
||||
let attrs = self.parse_outer_attributes()?;
|
||||
let expr = self.parse_expr_res(Restrictions::CONST_EXPR, attrs).map_err(|mut err| {
|
||||
err.span_label(
|
||||
start.shrink_to_lo(),
|
||||
"while parsing a const generic argument starting here",
|
||||
);
|
||||
err
|
||||
})?;
|
||||
let (expr, _) =
|
||||
self.parse_expr_res(Restrictions::CONST_EXPR, attrs).map_err(|mut err| {
|
||||
err.span_label(
|
||||
start.shrink_to_lo(),
|
||||
"while parsing a const generic argument starting here",
|
||||
);
|
||||
err
|
||||
})?;
|
||||
if !self.expr_is_valid_const_arg(&expr) {
|
||||
self.dcx().emit_err(ConstGenericWithoutBraces {
|
||||
span: expr.span,
|
||||
|
@ -2613,7 +2614,7 @@ impl<'a> Parser<'a> {
|
|||
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>`.
|
||||
if snapshot.token == token::EqEq {
|
||||
err.span_suggestion(
|
||||
|
@ -2671,7 +2672,7 @@ impl<'a> Parser<'a> {
|
|||
})() {
|
||||
// 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.
|
||||
Ok(expr) if let token::Comma | token::Gt = snapshot.token.kind => {
|
||||
Ok((expr, _)) if let token::Comma | token::Gt = snapshot.token.kind => {
|
||||
self.restore_snapshot(snapshot);
|
||||
Some(expr)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue