diff --git a/crates/ruff_linter/resources/test/fixtures/pyupgrade/UP017.py b/crates/ruff_linter/resources/test/fixtures/pyupgrade/UP017.py index b4a4aa96ccf30..1a49d2a844204 100644 --- a/crates/ruff_linter/resources/test/fixtures/pyupgrade/UP017.py +++ b/crates/ruff_linter/resources/test/fixtures/pyupgrade/UP017.py @@ -26,3 +26,14 @@ def func(): import datetime as dt print(dt.timezone.utc) + + +def func(): + import datetime + + print(( + datetime + .timezone # text + .utc + )) + diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs index c37281831f64a..b229be1e4866d 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs @@ -1,3 +1,4 @@ +use ruff_diagnostics::Applicability; use ruff_python_ast::Expr; use ruff_macros::{ViolationMetadata, derive_message_formats}; @@ -28,6 +29,9 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// datetime.UTC /// ``` /// +/// ## Fix safety +/// This rule's fix is marked as safe, unless the expression contains comments. +/// /// ## Options /// - `target-version` /// @@ -67,7 +71,18 @@ pub(crate) fn datetime_utc_alias(checker: &Checker, expr: &Expr) { checker.semantic(), )?; let reference_edit = Edit::range_replacement(binding, expr.range()); - Ok(Fix::safe_edits(import_edit, [reference_edit])) + + let applicability = if checker.comment_ranges().intersects(expr.range()) { + Applicability::Unsafe + } else { + Applicability::Safe + }; + + Ok(Fix::applicable_edits( + import_edit, + [reference_edit], + applicability, + )) }); } } diff --git a/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__datetime_utc_alias_py311.snap b/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__datetime_utc_alias_py311.snap index 1f92bdb01b70e..f2318a22c878a 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__datetime_utc_alias_py311.snap +++ b/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__datetime_utc_alias_py311.snap @@ -79,3 +79,28 @@ help: Convert to `datetime.UTC` alias 27 | - print(dt.timezone.utc) 28 + print(dt.UTC) +29 | +30 | +31 | def func(): + +UP017 [*] Use `datetime.UTC` alias + --> UP017.py:35:9 + | +34 | print(( +35 | / datetime +36 | | .timezone # text +37 | | .utc + | |____________^ +38 | )) + | +help: Convert to `datetime.UTC` alias +32 | import datetime +33 | +34 | print(( + - datetime + - .timezone # text + - .utc +35 + datetime.UTC +36 | )) +37 | +note: This is an unsafe fix and may change runtime behavior