From ee90cf8face38e5b8cc0aaf36e4b0cf5c4f3e662 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 29 Jan 2024 12:30:08 -0500 Subject: [PATCH] Mark unaliased-collections-abc-set-import fix as safe --- .../unaliased_collections_abc_set_import.rs | 18 ++++++++++++++++-- ...s__flake8_pyi__tests__PYI025_PYI025.py.snap | 4 ++-- ...__flake8_pyi__tests__PYI025_PYI025.pyi.snap | 8 ++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs index 79e6ba61a776e..5d3b0cd2f6844 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs @@ -1,4 +1,4 @@ -use ruff_diagnostics::{Diagnostic, Fix, FixAvailability, Violation}; +use ruff_diagnostics::{Applicability, Diagnostic, Fix, FixAvailability, Violation}; use ruff_macros::{derive_message_formats, violation}; use ruff_python_semantic::Imported; use ruff_python_semantic::{Binding, BindingKind}; @@ -29,6 +29,12 @@ use crate::renamer::Renamer; /// ```python /// from collections.abc import Set as AbstractSet /// ``` +/// +/// ## Fix safety +/// This rule's fix is marked as unsafe for `Set` imports defined at the +/// top-level of a module. Top-level symbols are implicitly exported by the +/// module, and so renaming a top-level symbol may break downstream modules +/// that import it. #[violation] pub struct UnaliasedCollectionsAbcSetImport; @@ -69,7 +75,15 @@ pub(crate) fn unaliased_collections_abc_set_import( diagnostic.try_set_fix(|| { let scope = &checker.semantic().scopes[binding.scope]; let (edit, rest) = Renamer::rename(name, "AbstractSet", scope, checker.semantic())?; - Ok(Fix::unsafe_edits(edit, rest)) + Ok(Fix::applicable_edits( + edit, + rest, + if scope.kind.is_module() { + Applicability::Unsafe + } else { + Applicability::Safe + }, + )) }); } Some(diagnostic) diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.py.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.py.snap index 4c065291fd825..ebbbebba5ce05 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.py.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.py.snap @@ -9,7 +9,7 @@ PYI025.py:10:33: PYI025 [*] Use `from collections.abc import Set as AbstractSet` | = help: Alias `Set` to `AbstractSet` -ℹ Unsafe fix +ℹ Safe fix 7 7 | 8 8 | 9 9 | def f(): @@ -29,7 +29,7 @@ PYI025.py:14:51: PYI025 [*] Use `from collections.abc import Set as AbstractSet` | = help: Alias `Set` to `AbstractSet` -ℹ Unsafe fix +ℹ Safe fix 11 11 | 12 12 | 13 13 | def f(): diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.pyi.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.pyi.snap index 96752937fb791..7ae80bb5f2b85 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.pyi.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.pyi.snap @@ -11,7 +11,7 @@ PYI025.pyi:8:33: PYI025 [*] Use `from collections.abc import Set as AbstractSet` | = help: Alias `Set` to `AbstractSet` -ℹ Unsafe fix +ℹ Safe fix 5 5 | from collections.abc import Container, Sized, Set as AbstractSet, ValuesView # Ok 6 6 | 7 7 | def f(): @@ -31,7 +31,7 @@ PYI025.pyi:11:51: PYI025 [*] Use `from collections.abc import Set as AbstractSet | = help: Alias `Set` to `AbstractSet` -ℹ Unsafe fix +ℹ Safe fix 8 8 | from collections.abc import Set # PYI025 9 9 | 10 10 | def f(): @@ -52,7 +52,7 @@ PYI025.pyi:16:37: PYI025 [*] Use `from collections.abc import Set as AbstractSet | = help: Alias `Set` to `AbstractSet` -ℹ Unsafe fix +ℹ Safe fix 13 13 | def f(): 14 14 | """Test: local symbol renaming.""" 15 15 | if True: @@ -130,7 +130,7 @@ PYI025.pyi:44:33: PYI025 [*] Use `from collections.abc import Set as AbstractSet | = help: Alias `Set` to `AbstractSet` -ℹ Unsafe fix +ℹ Safe fix 41 41 | 42 42 | def f(): 43 43 | """Test: nonlocal symbol renaming."""