ruff/crates
Brent Westbrook 75a562d313
[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
2025-03-17 08:54:55 -04:00
..
red_knot [red-knot] Add --color CLI option (#16758) 2025-03-17 10:06:34 +00:00
red_knot_project [internal]: Upgrade salsa (#16794) 2025-03-17 11:05:54 +01:00
red_knot_python_semantic [red-knot] Stabilize negation_reverses_subtype_order property test (#16801) 2025-03-17 12:33:38 +00:00
red_knot_server [red-knot] LSP: only emit WARN logs from non-red-knot sources (#16760) 2025-03-15 08:47:50 -07:00
red_knot_test [red-knot] Case sensitive module resolver (#16521) 2025-03-14 19:16:44 +00:00
red_knot_vendored Sync vendored typeshed stubs (#16762) 2025-03-15 00:38:58 +00:00
red_knot_wasm [red-knot] Case sensitive module resolver (#16521) 2025-03-14 19:16:44 +00:00
ruff Ruff 0.11.0 (#16723) 2025-03-14 13:57:56 +01:00
ruff_annotate_snippets Update pre-commit dependencies (#16465) 2025-03-03 13:10:46 +05:30
ruff_benchmark [ci]: Fixup codspeed upgrade (#16790) 2025-03-17 09:14:22 +01:00
ruff_cache
ruff_db [internal]: Upgrade salsa (#16794) 2025-03-17 11:05:54 +01:00
ruff_dev Pass ParserOptions to the parser (#16220) 2025-02-19 10:50:50 -05:00
ruff_diagnostics
ruff_formatter bump MSRV to 1.83 (#16294) 2025-02-26 06:12:43 -08:00
ruff_graph Pass ParserOptions to the parser (#16220) 2025-02-19 10:50:50 -05:00
ruff_index [red-knot] Don't use separate ID types for each alist (#16415) 2025-02-28 14:55:55 -05:00
ruff_linter [flake8-bandit] Allow raw strings in suspicious-mark-safe-usage (S308) #16702 (#16770) 2025-03-17 11:29:07 +01:00
ruff_macros Add knot.toml schema (#15735) 2025-02-07 10:59:40 +01:00
ruff_notebook bump MSRV to 1.83 (#16294) 2025-02-26 06:12:43 -08:00
ruff_python_ast [red-knot] Auto generate statement nodes (#16645) 2025-03-13 15:43:48 +01:00
ruff_python_ast_integration_tests Pass ParserOptions to the parser (#16220) 2025-02-19 10:50:50 -05:00
ruff_python_codegen Pass ParserOptions to the parser (#16220) 2025-02-19 10:50:50 -05:00
ruff_python_formatter [formatter] Stabilize fix for single-with-item formatting with trailing comment (#16603) 2025-03-13 15:37:37 +01:00
ruff_python_index
ruff_python_literal Preserve triple quotes and prefixes for strings (#15818) 2025-02-04 08:41:06 -05:00
ruff_python_parser [syntax-errors] Parenthesized context managers before Python 3.9 (#16523) 2025-03-17 08:54:55 -04:00
ruff_python_resolver bump MSRV to 1.83 (#16294) 2025-02-26 06:12:43 -08:00
ruff_python_semantic Consider all TYPE_CHECKING symbols for type-checking blocks (#16669) 2025-03-13 15:37:37 +01:00
ruff_python_stdlib
ruff_python_trivia [red-knot] Ignore surrounding whitespace when looking for <!-- snapshot-diagnostics --> directives in mdtests (#16380) 2025-02-27 13:25:31 +00:00
ruff_python_trivia_integration_tests Pass ParserOptions to the parser (#16220) 2025-02-19 10:50:50 -05:00
ruff_server Fallback to requires-python in certain cases when target-version is not found (#16721) 2025-03-14 09:36:51 +01:00
ruff_source_file
ruff_text_size
ruff_wasm Ruff 0.11.0 (#16723) 2025-03-14 13:57:56 +01:00
ruff_workspace Fallback to requires-python in certain cases when target-version is not found (#16721) 2025-03-14 09:36:51 +01:00