From b70dde4a777df0172383e76ae7c914314f5da70e Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sun, 3 Sep 2023 14:23:36 +0100 Subject: [PATCH] Avoid attempting to fix invalid `Optional` annotations (#7079) --- .../resources/test/fixtures/pyupgrade/UP007.py | 4 ++++ .../pyupgrade/rules/use_pep604_annotation.rs | 15 +++++++++++---- .../ruff__rules__pyupgrade__tests__UP007.py.snap | 8 ++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/pyupgrade/UP007.py b/crates/ruff/resources/test/fixtures/pyupgrade/UP007.py index 47c9fdbc0a..f1c658798e 100644 --- a/crates/ruff/resources/test/fixtures/pyupgrade/UP007.py +++ b/crates/ruff/resources/test/fixtures/pyupgrade/UP007.py @@ -91,3 +91,7 @@ def f(x: Optional[int : float]) -> None: def f(x: Optional[str, int : float]) -> None: ... + + +def f(x: Optional[int, float]) -> 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 7873dc98ea..cfa6615f0a 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/use_pep604_annotation.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/use_pep604_annotation.rs @@ -77,10 +77,17 @@ pub(crate) fn use_pep604_annotation( Pep604Operator::Optional => { let mut diagnostic = Diagnostic::new(NonPEP604Annotation, expr.range()); if fixable && checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( - optional(slice, checker.locator()), - expr.range(), - ))); + match slice { + Expr::Tuple(_) => { + // Invalid type annotation. + } + _ => { + diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + optional(slice, checker.locator()), + expr.range(), + ))); + } + } } checker.diagnostics.push(diagnostic); } 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 b5b6998a18..fd473b7096 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 @@ -361,4 +361,12 @@ UP007.py:92:10: UP007 Use `X | Y` for type annotations | = help: Convert to `X | Y` +UP007.py:96:10: UP007 Use `X | Y` for type annotations + | +96 | def f(x: Optional[int, float]) -> None: + | ^^^^^^^^^^^^^^^^^^^^ UP007 +97 | ... + | + = help: Convert to `X | Y` +