Avoid off-by-one error in with-item named expressions (#8915)

## Summary

Given `with (a := b): pass`, we truncate the `WithItem` range by one on
both sides such that the parentheses are part of the statement, rather
than the item. However, for `with (a := b) as x: pass`, we want to avoid
this trick.

Closes https://github.com/astral-sh/ruff/issues/8913.
This commit is contained in:
Charlie Marsh 2023-11-29 16:11:04 -08:00 committed by GitHub
parent fd70cd789f
commit 774c77adae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 5 additions and 5 deletions

View file

@ -1026,7 +1026,7 @@ WithItems: Vec<ast::WithItem> = {
// ```
// In this case, the `(` and `)` are part of the `with` statement.
// The same applies to `yield` and `yield from`.
let item = if matches!(item.context_expr, ast::Expr::NamedExpr(_) | ast::Expr::Yield(_) | ast::Expr::YieldFrom(_)) {
let item = if item.optional_vars.is_none() && matches!(item.context_expr, ast::Expr::NamedExpr(_) | ast::Expr::Yield(_) | ast::Expr::YieldFrom(_)) {
ast::WithItem {
range: item.range().add_start(TextSize::new(1)).sub_end(TextSize::new(1)),
context_expr: item.context_expr,