Skip to content

Commit be76fad

Browse files
authored
[pyupgrade] make fix unsafe if it deletes comments (UP010, unnecessary-future-import) (#18291)
1 parent e293411 commit be76fad

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

crates/ruff_linter/resources/test/fixtures/pyupgrade/UP010.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@
1212
if True:
1313
from __future__ import generator_stop
1414
from __future__ import invalid_module, generators
15+
from __future__ import generators # comment

crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_future_import.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use itertools::Itertools;
22
use ruff_python_ast::{Alias, Stmt};
33

4-
use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Fix};
4+
use ruff_diagnostics::{AlwaysFixableViolation, Applicability, Diagnostic, Fix};
55
use ruff_macros::{ViolationMetadata, derive_message_formats};
66
use ruff_text_size::Ranged;
77

@@ -123,9 +123,19 @@ pub(crate) fn unnecessary_future_import(checker: &Checker, stmt: &Stmt, names: &
123123
checker.stylist(),
124124
checker.indexer(),
125125
)?;
126-
Ok(Fix::safe_edit(edit).isolate(Checker::isolation(
127-
checker.semantic().current_statement_parent_id(),
128-
)))
126+
127+
let range = edit.range();
128+
let applicability = if checker.comment_ranges().intersects(range) {
129+
Applicability::Unsafe
130+
} else {
131+
Applicability::Safe
132+
};
133+
134+
Ok(
135+
Fix::applicable_edit(edit, applicability).isolate(Checker::isolation(
136+
checker.semantic().current_statement_parent_id(),
137+
)),
138+
)
129139
});
130140
checker.report_diagnostic(diagnostic);
131141
}

crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__UP010.py.snap

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ UP010.py:13:5: UP010 [*] Unnecessary `__future__` import `generator_stop` for ta
156156
13 | from __future__ import generator_stop
157157
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP010
158158
14 | from __future__ import invalid_module, generators
159+
15 | from __future__ import generators # comment
159160
|
160161
= help: Remove unnecessary `__future__` import
161162

@@ -165,13 +166,15 @@ UP010.py:13:5: UP010 [*] Unnecessary `__future__` import `generator_stop` for ta
165166
12 12 | if True:
166167
13 |- from __future__ import generator_stop
167168
14 13 | from __future__ import invalid_module, generators
169+
15 14 | from __future__ import generators # comment
168170

169171
UP010.py:14:5: UP010 [*] Unnecessary `__future__` import `generators` for target Python version
170172
|
171173
12 | if True:
172174
13 | from __future__ import generator_stop
173175
14 | from __future__ import invalid_module, generators
174176
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP010
177+
15 | from __future__ import generators # comment
175178
|
176179
= help: Remove unnecessary `__future__` import
177180

@@ -181,3 +184,19 @@ UP010.py:14:5: UP010 [*] Unnecessary `__future__` import `generators` for target
181184
13 13 | from __future__ import generator_stop
182185
14 |- from __future__ import invalid_module, generators
183186
14 |+ from __future__ import invalid_module
187+
15 15 | from __future__ import generators # comment
188+
189+
UP010.py:15:5: UP010 [*] Unnecessary `__future__` import `generators` for target Python version
190+
|
191+
13 | from __future__ import generator_stop
192+
14 | from __future__ import invalid_module, generators
193+
15 | from __future__ import generators # comment
194+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP010
195+
|
196+
= help: Remove unnecessary `__future__` import
197+
198+
Unsafe fix
199+
12 12 | if True:
200+
13 13 | from __future__ import generator_stop
201+
14 14 | from __future__ import invalid_module, generators
202+
15 |- from __future__ import generators # comment

0 commit comments

Comments
 (0)