Improve span handling in parse_expr_bottom
.
`parse_expr_bottom` stores `this.token.span` in `lo`, but then fails to use it in many places where it could. This commit fixes that, and likewise (to a smaller extent) in `parse_ty_common`.
This commit is contained in:
parent
6b6a867ae9
commit
90ad2adfea
3 changed files with 14 additions and 21 deletions
|
@ -1990,7 +1990,6 @@ impl<'a> Parser<'a> {
|
||||||
/// `await? <expr>`, `await(<expr>)`, and `await { <expr> }`.
|
/// `await? <expr>`, `await(<expr>)`, and `await { <expr> }`.
|
||||||
pub(super) fn recover_incorrect_await_syntax(
|
pub(super) fn recover_incorrect_await_syntax(
|
||||||
&mut self,
|
&mut self,
|
||||||
lo: Span,
|
|
||||||
await_sp: Span,
|
await_sp: Span,
|
||||||
) -> PResult<'a, P<Expr>> {
|
) -> PResult<'a, P<Expr>> {
|
||||||
let (hi, expr, is_question) = if self.token == token::Not {
|
let (hi, expr, is_question) = if self.token == token::Not {
|
||||||
|
@ -1999,8 +1998,8 @@ impl<'a> Parser<'a> {
|
||||||
} else {
|
} else {
|
||||||
self.recover_await_prefix(await_sp)?
|
self.recover_await_prefix(await_sp)?
|
||||||
};
|
};
|
||||||
let (sp, guar) = self.error_on_incorrect_await(lo, hi, &expr, is_question);
|
let (sp, guar) = self.error_on_incorrect_await(await_sp, hi, &expr, is_question);
|
||||||
let expr = self.mk_expr_err(lo.to(sp), guar);
|
let expr = self.mk_expr_err(await_sp.to(sp), guar);
|
||||||
self.maybe_recover_from_bad_qpath(expr)
|
self.maybe_recover_from_bad_qpath(expr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1446,34 +1446,31 @@ impl<'a> Parser<'a> {
|
||||||
this.parse_expr_closure()
|
this.parse_expr_closure()
|
||||||
} else {
|
} else {
|
||||||
assert!(this.eat_keyword(kw::For));
|
assert!(this.eat_keyword(kw::For));
|
||||||
this.parse_expr_for(None, this.prev_token.span)
|
this.parse_expr_for(None, lo)
|
||||||
}
|
}
|
||||||
} else if this.eat_keyword(kw::While) {
|
} else if this.eat_keyword(kw::While) {
|
||||||
this.parse_expr_while(None, this.prev_token.span)
|
this.parse_expr_while(None, lo)
|
||||||
} else if let Some(label) = this.eat_label() {
|
} else if let Some(label) = this.eat_label() {
|
||||||
this.parse_expr_labeled(label, true)
|
this.parse_expr_labeled(label, true)
|
||||||
} else if this.eat_keyword(kw::Loop) {
|
} else if this.eat_keyword(kw::Loop) {
|
||||||
let sp = this.prev_token.span;
|
this.parse_expr_loop(None, lo).map_err(|mut err| {
|
||||||
this.parse_expr_loop(None, this.prev_token.span).map_err(|mut err| {
|
err.span_label(lo, "while parsing this `loop` expression");
|
||||||
err.span_label(sp, "while parsing this `loop` expression");
|
|
||||||
err
|
err
|
||||||
})
|
})
|
||||||
} else if this.eat_keyword(kw::Match) {
|
} else if this.eat_keyword(kw::Match) {
|
||||||
let match_sp = this.prev_token.span;
|
|
||||||
this.parse_expr_match().map_err(|mut err| {
|
this.parse_expr_match().map_err(|mut err| {
|
||||||
err.span_label(match_sp, "while parsing this `match` expression");
|
err.span_label(lo, "while parsing this `match` expression");
|
||||||
err
|
err
|
||||||
})
|
})
|
||||||
} else if this.eat_keyword(kw::Unsafe) {
|
} else if this.eat_keyword(kw::Unsafe) {
|
||||||
let sp = this.prev_token.span;
|
|
||||||
this.parse_expr_block(None, lo, BlockCheckMode::Unsafe(ast::UserProvided)).map_err(
|
this.parse_expr_block(None, lo, BlockCheckMode::Unsafe(ast::UserProvided)).map_err(
|
||||||
|mut err| {
|
|mut err| {
|
||||||
err.span_label(sp, "while parsing this `unsafe` expression");
|
err.span_label(lo, "while parsing this `unsafe` expression");
|
||||||
err
|
err
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
} else if this.check_inline_const(0) {
|
} else if this.check_inline_const(0) {
|
||||||
this.parse_const_block(lo.to(this.token.span), false)
|
this.parse_const_block(lo, false)
|
||||||
} else if this.may_recover() && this.is_do_catch_block() {
|
} else if this.may_recover() && this.is_do_catch_block() {
|
||||||
this.recover_do_catch()
|
this.recover_do_catch()
|
||||||
} else if this.is_try_block() {
|
} else if this.is_try_block() {
|
||||||
|
@ -1514,7 +1511,7 @@ impl<'a> Parser<'a> {
|
||||||
this.parse_expr_closure()
|
this.parse_expr_closure()
|
||||||
}
|
}
|
||||||
} else if this.eat_keyword_noexpect(kw::Await) {
|
} else if this.eat_keyword_noexpect(kw::Await) {
|
||||||
this.recover_incorrect_await_syntax(lo, this.prev_token.span)
|
this.recover_incorrect_await_syntax(lo)
|
||||||
} else {
|
} else {
|
||||||
this.parse_expr_lit()
|
this.parse_expr_lit()
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,7 +274,6 @@ impl<'a> Parser<'a> {
|
||||||
// Function pointer type
|
// Function pointer type
|
||||||
self.parse_ty_bare_fn(lo, ThinVec::new(), None, recover_return_sign)?
|
self.parse_ty_bare_fn(lo, ThinVec::new(), None, recover_return_sign)?
|
||||||
} else if self.check_keyword(kw::For) {
|
} else if self.check_keyword(kw::For) {
|
||||||
let for_span = self.token.span;
|
|
||||||
// Function pointer type or bound list (trait object type) starting with a poly-trait.
|
// Function pointer type or bound list (trait object type) starting with a poly-trait.
|
||||||
// `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T`
|
// `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T`
|
||||||
// `for<'lt> Trait1<'lt> + Trait2 + 'a`
|
// `for<'lt> Trait1<'lt> + Trait2 + 'a`
|
||||||
|
@ -302,7 +301,7 @@ impl<'a> Parser<'a> {
|
||||||
kw: kw.name.as_str(),
|
kw: kw.name.as_str(),
|
||||||
sugg: errors::TransposeDynOrImplSugg {
|
sugg: errors::TransposeDynOrImplSugg {
|
||||||
removal_span,
|
removal_span,
|
||||||
insertion_span: for_span.shrink_to_lo(),
|
insertion_span: lo.shrink_to_lo(),
|
||||||
kw: kw.name.as_str(),
|
kw: kw.name.as_str(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -345,16 +344,14 @@ impl<'a> Parser<'a> {
|
||||||
// FIXME(c_variadic): Should we just allow `...` syntactically
|
// FIXME(c_variadic): Should we just allow `...` syntactically
|
||||||
// anywhere in a type and use semantic restrictions instead?
|
// anywhere in a type and use semantic restrictions instead?
|
||||||
// NOTE: This may regress certain MBE calls if done incorrectly.
|
// NOTE: This may regress certain MBE calls if done incorrectly.
|
||||||
let guar = self
|
let guar = self.dcx().emit_err(NestedCVariadicType { span: lo });
|
||||||
.dcx()
|
|
||||||
.emit_err(NestedCVariadicType { span: lo.to(self.prev_token.span) });
|
|
||||||
TyKind::Err(guar)
|
TyKind::Err(guar)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let msg = format!("expected type, found {}", super::token_descr(&self.token));
|
let msg = format!("expected type, found {}", super::token_descr(&self.token));
|
||||||
let mut err = self.dcx().struct_span_err(self.token.span, msg);
|
let mut err = self.dcx().struct_span_err(lo, msg);
|
||||||
err.span_label(self.token.span, "expected type");
|
err.span_label(lo, "expected type");
|
||||||
return Err(err);
|
return Err(err);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue