[syntax-errors] Parenthesized context managers before Python 3.9 (#16523)

Summary
--

I thought this was very complicated based on the comment here:
https://github.com/astral-sh/ruff/pull/16106#issuecomment-2653505671 and
on some of the discussion in the CPython issue here:
https://github.com/python/cpython/issues/56991. However, after a little
bit of experimentation, I think it boils down to this example:

```python
with (x as y): ...
```

The issue is parentheses around a `with` item with an `optional_var`, as
we (and
[Python](https://docs.python.org/3/library/ast.html#ast.withitem)) call
the trailing variable name (`y` in this case). It's not actually about
line breaks after all, except that line breaks are allowed in
parenthesized expressions, which explains the validity of cases like


```pycon
>>> with (
...     x,
...     y
... ) as foo:
...     pass
... 
```

even on Python 3.8.

I followed [pyright]'s example again here on the diagnostic range (just
the opening paren) and the wording of the error.


Test Plan
--
Inline tests

[pyright]:
https://pyright-play.net/?pythonVersion=3.7&strict=true&code=FAdwlgLgFgBAFAewA4FMB2cBEAzBCB0EAHhJgJQwCGAzjLgmQFwz6tA
This commit is contained in:
Brent Westbrook 2025-03-17 08:54:55 -04:00 committed by GitHub
parent 8d3643f409
commit 75a562d313
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 800 additions and 0 deletions

View file

@ -0,0 +1,4 @@
# parse_options: {"target-version": "3.9"}
with (foo as x, bar as y): ...
with (foo, bar as y): ...
with (foo as x, bar): ...

View file

@ -0,0 +1,6 @@
# parse_options: {"target-version": "3.8"}
with (
foo,
bar,
baz,
) as tup: ...