[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