diff --git a/crates/ruff/resources/test/fixtures/pyupgrade/UP007.py b/crates/ruff/resources/test/fixtures/pyupgrade/UP007.py index 7d421d9180..3f8218f36c 100644 --- a/crates/ruff/resources/test/fixtures/pyupgrade/UP007.py +++ b/crates/ruff/resources/test/fixtures/pyupgrade/UP007.py @@ -103,3 +103,8 @@ class ServiceRefOrValue: list[ServiceSpecificationRef] | list[ServiceSpecification] ] = None + + +# Regression test for: https://github.com/astral-sh/ruff/issues/7201 +class ServiceRefOrValue: + service_specification: Optional[str]is not True = None diff --git a/crates/ruff/src/rules/pyupgrade/rules/use_pep604_annotation.rs b/crates/ruff/src/rules/pyupgrade/rules/use_pep604_annotation.rs index bbfe13729c..c1fbbfa6ce 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/use_pep604_annotation.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/use_pep604_annotation.rs @@ -4,6 +4,7 @@ use ruff_python_ast::{self as ast, Constant, Expr, ExprContext, Operator}; use ruff_python_semantic::analyze::typing::Pep604Operator; use ruff_text_size::{Ranged, TextRange}; +use crate::autofix::edits::pad; use crate::checkers::ast::Checker; use crate::registry::AsRule; @@ -79,7 +80,11 @@ pub(crate) fn use_pep604_annotation( } _ => { diagnostic.set_fix(Fix::suggested(Edit::range_replacement( - checker.generator().expr(&optional(slice)), + pad( + checker.generator().expr(&optional(slice)), + expr.range(), + checker.locator(), + ), expr.range(), ))); } @@ -96,14 +101,22 @@ pub(crate) fn use_pep604_annotation( } Expr::Tuple(ast::ExprTuple { elts, .. }) => { diagnostic.set_fix(Fix::suggested(Edit::range_replacement( - checker.generator().expr(&union(elts)), + pad( + checker.generator().expr(&union(elts)), + expr.range(), + checker.locator(), + ), expr.range(), ))); } _ => { // Single argument. diagnostic.set_fix(Fix::suggested(Edit::range_replacement( - checker.locator().slice(slice).to_string(), + pad( + checker.locator().slice(slice).to_string(), + expr.range(), + checker.locator(), + ), expr.range(), ))); } diff --git a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP007.py.snap b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP007.py.snap index e60b4e51aa..e93227555c 100644 --- a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP007.py.snap +++ b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP007.py.snap @@ -391,5 +391,24 @@ UP007.py:102:28: UP007 [*] Use `X | Y` for type annotations 104 |- | list[ServiceSpecification] 105 |- ] = None 102 |+ service_specification: list[ServiceSpecificationRef] | list[ServiceSpecification] | None = None +106 103 | +107 104 | +108 105 | # Regression test for: https://github.com/astral-sh/ruff/issues/7201 + +UP007.py:110:28: UP007 [*] Use `X | Y` for type annotations + | +108 | # Regression test for: https://github.com/astral-sh/ruff/issues/7201 +109 | class ServiceRefOrValue: +110 | service_specification: Optional[str]is not True = None + | ^^^^^^^^^^^^^ UP007 + | + = help: Convert to `X | Y` + +ℹ Suggested fix +107 107 | +108 108 | # Regression test for: https://github.com/astral-sh/ruff/issues/7201 +109 109 | class ServiceRefOrValue: +110 |- service_specification: Optional[str]is not True = None + 110 |+ service_specification: str | None is not True = None