Rollup merge of #114434 - Nilstrieb:indexing-spans, r=est31

Improve spans for indexing expressions

fixes #114388

Indexing is similar to method calls in having an arbitrary left-hand-side and then something on the right, which is the main part of the expression. Method calls already have a span for that right part, but indexing does not. This means that long method chains that use indexing have really bad spans, especially when the indexing panics and that span in coverted into a panic location.

This does the same thing as method calls for the AST and HIR, storing an extra span which is then put into the `fn_span` field in THIR.

r? compiler-errors
This commit is contained in:
Matthias Krüger 2023-08-04 21:31:57 +02:00 committed by GitHub
commit 6e87f866ec
3 changed files with 5 additions and 5 deletions

View File

@ -256,7 +256,7 @@ pub(crate) fn format_expr(
shape, shape,
SeparatorPlace::Back, SeparatorPlace::Back,
), ),
ast::ExprKind::Index(ref expr, ref index) => { ast::ExprKind::Index(ref expr, ref index, _) => {
rewrite_index(&**expr, &**index, context, shape) rewrite_index(&**expr, &**index, context, shape)
} }
ast::ExprKind::Repeat(ref expr, ref repeats) => rewrite_pair( ast::ExprKind::Repeat(ref expr, ref repeats) => rewrite_pair(
@ -1342,7 +1342,7 @@ pub(crate) fn is_simple_expr(expr: &ast::Expr) -> bool {
| ast::ExprKind::Field(ref expr, _) | ast::ExprKind::Field(ref expr, _)
| ast::ExprKind::Try(ref expr) | ast::ExprKind::Try(ref expr)
| ast::ExprKind::Unary(_, ref expr) => is_simple_expr(expr), | ast::ExprKind::Unary(_, ref expr) => is_simple_expr(expr),
ast::ExprKind::Index(ref lhs, ref rhs) => is_simple_expr(lhs) && is_simple_expr(rhs), ast::ExprKind::Index(ref lhs, ref rhs, _) => is_simple_expr(lhs) && is_simple_expr(rhs),
ast::ExprKind::Repeat(ref lhs, ref rhs) => { ast::ExprKind::Repeat(ref lhs, ref rhs) => {
is_simple_expr(lhs) && is_simple_expr(&*rhs.value) is_simple_expr(lhs) && is_simple_expr(&*rhs.value)
} }

View File

@ -594,7 +594,7 @@ fn can_flatten_block_around_this(body: &ast::Expr) -> bool {
ast::ExprKind::AddrOf(_, _, ref expr) ast::ExprKind::AddrOf(_, _, ref expr)
| ast::ExprKind::Try(ref expr) | ast::ExprKind::Try(ref expr)
| ast::ExprKind::Unary(_, ref expr) | ast::ExprKind::Unary(_, ref expr)
| ast::ExprKind::Index(ref expr, _) | ast::ExprKind::Index(ref expr, _, _)
| ast::ExprKind::Cast(ref expr, _) => can_flatten_block_around_this(expr), | ast::ExprKind::Cast(ref expr, _) => can_flatten_block_around_this(expr),
_ => false, _ => false,
} }

View File

@ -441,7 +441,7 @@ pub(crate) fn left_most_sub_expr(e: &ast::Expr) -> &ast::Expr {
| ast::ExprKind::Assign(ref e, _, _) | ast::ExprKind::Assign(ref e, _, _)
| ast::ExprKind::AssignOp(_, ref e, _) | ast::ExprKind::AssignOp(_, ref e, _)
| ast::ExprKind::Field(ref e, _) | ast::ExprKind::Field(ref e, _)
| ast::ExprKind::Index(ref e, _) | ast::ExprKind::Index(ref e, _, _)
| ast::ExprKind::Range(Some(ref e), _, _) | ast::ExprKind::Range(Some(ref e), _, _)
| ast::ExprKind::Try(ref e) => left_most_sub_expr(e), | ast::ExprKind::Try(ref e) => left_most_sub_expr(e),
_ => e, _ => e,
@ -479,7 +479,7 @@ pub(crate) fn is_block_expr(context: &RewriteContext<'_>, expr: &ast::Expr, repr
| ast::ExprKind::Match(..) => repr.contains('\n'), | ast::ExprKind::Match(..) => repr.contains('\n'),
ast::ExprKind::Paren(ref expr) ast::ExprKind::Paren(ref expr)
| ast::ExprKind::Binary(_, _, ref expr) | ast::ExprKind::Binary(_, _, ref expr)
| ast::ExprKind::Index(_, ref expr) | ast::ExprKind::Index(_, ref expr, _)
| ast::ExprKind::Unary(_, ref expr) | ast::ExprKind::Unary(_, ref expr)
| ast::ExprKind::Try(ref expr) | ast::ExprKind::Try(ref expr)
| ast::ExprKind::Yield(Some(ref expr)) => is_block_expr(context, expr, repr), | ast::ExprKind::Yield(Some(ref expr)) => is_block_expr(context, expr, repr),