Skip to content

Fix PLC2701 for type parameter scopes#24576

Merged
ntBre merged 1 commit into
astral-sh:mainfrom
ShipItAndPray:fix/plc2701-type-params
Apr 22, 2026
Merged

Fix PLC2701 for type parameter scopes#24576
ntBre merged 1 commit into
astral-sh:mainfrom
ShipItAndPray:fix/plc2701-type-params

Conversation

@ShipItAndPray
Copy link
Copy Markdown
Contributor

@ShipItAndPray ShipItAndPray commented Apr 12, 2026

Fixes #24563.

Ruff was treating private-name usage in PEP 695 type parameter lists as runtime code, which triggered PLC2701 false positives. This patch extends the typing-context check so private imports used only in type parameter scopes are exempt, and adds a regression case for a generic function with a private type parameter bound.

@astral-sh-bot
Copy link
Copy Markdown

astral-sh-bot Bot commented Apr 13, 2026

ruff-ecosystem results

Linter (stable)

✅ ecosystem check detected no linter changes.

Linter (preview)

✅ ecosystem check detected no linter changes.

@ntBre ntBre added the rule Implementing or modifying a lint rule label Apr 13, 2026
@ntBre ntBre added the preview Related to preview mode features label Apr 22, 2026
Copy link
Copy Markdown
Contributor

@ntBre ntBre left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me, thank you! I also verified locally that the example from the issue succeeds on this branch.

|| reference.in_typing_only_annotation()
|| reference.in_string_type_definition()
|| reference.in_runtime_evaluated_annotation()
reference.in_typing_context() || reference.in_runtime_evaluated_annotation()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For posterity, the new checks expand to these SemanticModelFlags:

TYPE_CHECKING_BLOCK | TYPING_ONLY_ANNOTATION | STRING_TYPE_DEFINITION | TYPE_PARAM_DEFINITION | RUNTIME_EVALUATED_ANNOTATION

while the old checks were:

TYPE_CHECKING_BLOCK | TYPING_ONLY_ANNOTATION | STRING_TYPE_DEFINITION | RUNTIME_EVALUATED_ANNOTATION

so the diff is just adding TYPE_PARAM_DEFINITION:

-TYPE_CHECKING_BLOCK | TYPING_ONLY_ANNOTATION | STRING_TYPE_DEFINITION | RUNTIME_EVALUATED_ANNOTATION
+TYPE_CHECKING_BLOCK | TYPING_ONLY_ANNOTATION | STRING_TYPE_DEFINITION | TYPE_PARAM_DEFINITION | RUNTIME_EVALUATED_ANNOTATION

@ntBre ntBre merged commit 65ec6e6 into astral-sh:main Apr 22, 2026
44 checks passed
nicopauss pushed a commit to Intersec/lib-common that referenced this pull request Jun 4, 2026
##### [\`v0.15.12\`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#01512)

Released on 2026-04-24.

##### Preview features

- Implement `#ruff:file-ignore` file-level suppressions ([#23599](astral-sh/ruff#23599))
- Implement `#ruff:ignore` logical-line suppressions ([#23404](astral-sh/ruff#23404))
- Revert preview changes to displayed diagnostic severity in LSP ([#24789](astral-sh/ruff#24789))
- \[`airflow`] Implement `task-branch-as-short-circuit` (`AIR004`) ([#23579](astral-sh/ruff#23579))
- \[`flake8-bugbear`] Fix `break`/`continue` handling in `loop-iterator-mutation` (`B909`) ([#24440](astral-sh/ruff#24440))
- \[`pylint`] Fix `PLC2701` for type parameter scopes ([#24576](astral-sh/ruff#24576))

##### Rule changes

- \[`pandas-vet`] Suggest `.array` as well in `PD011` ([#24805](astral-sh/ruff#24805))

##### CLI

- Respect default Unix permissions for cache files ([#24794](astral-sh/ruff#24794))

##### Documentation

- \[`pylint`] Fix `PLR0124` description not to claim self-comparison always returns the same value ([#24749](astral-sh/ruff#24749))
- \[`pyupgrade`] Expand docs on reusable `TypeVar`s and scoping (`UP046`) ([#24153](astral-sh/ruff#24153))
- Improve rules table accessibility ([#24711](astral-sh/ruff#24711))

##### Contributors

- [@dylwil3](https://github.com/dylwil3)
- [@AlexWaygood](https://github.com/AlexWaygood)
- [@woodruffw](https://github.com/woodruffw)
- [@avasis-ai](https://github.com/avasis-ai)
- [@Dev-iL](https://github.com/Dev-iL)
- [@denyszhak](https://github.com/denyszhak)
- [@ShipItAndPray](https://github.com/ShipItAndPray)
- [@anishgirianish](https://github.com/anishgirianish)
- [@augustelalande](https://github.com/augustelalande)
- [@amyreese](https://github.com/amyreese)
- [@majiayu000](https://github.com/majiayu000)
##### [\`v0.15.11\`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#01511)

Released on 2026-04-16.

##### Preview features

- \[`ruff`] Ignore `RUF029` when function is decorated with `asynccontextmanager` ([#24642](astral-sh/ruff#24642))
- \[`airflow`] Implement `airflow-xcom-pull-in-template-string` (`AIR201`) ([#23583](astral-sh/ruff#23583))
- \[`flake8-bandit`] Fix `S103` false positives and negatives in mask analysis ([#24424](astral-sh/ruff#24424))

##### Bug fixes

- \[`flake8-async`] Omit overridden methods for `ASYNC109` ([#24648](astral-sh/ruff#24648))

##### Documentation

- \[`flake8-async`] Add override mention to `ASYNC109` docs ([#24666](astral-sh/ruff#24666))
- Update Neovim config examples to use `vim.lsp.config` ([#24577](astral-sh/ruff#24577))

##### Contributors

- [@augustelalande](https://github.com/augustelalande)
- [@anishgirianish](https://github.com/anishgirianish)
- [@benberryallwood](https://github.com/benberryallwood)
- [@charliermarsh](https://github.com/charliermarsh)
- [@Dev-iL](https://github.com/Dev-iL)

Renovate-Branch: renovate/2024.6-ruff-0.15.x
Change-Id: I2c5de44f14ce3133db71161eae18c7b43f7ba09b
Priv-Id: 9c1a7f10043a2db2338a90de9a62a4d7989df14d
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview Related to preview mode features rule Implementing or modifying a lint rule

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PLC2701 false positive for a private name import used in a type parameter list

4 participants