mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-02 22:55:08 +00:00
Prioritize redefined-while-unused
over unused-import
(#11173)
## Summary This PR adds an override to the fixer to ensure that we apply any `redefined-while-unused` fixes prior to `unused-import`. Closes https://github.com/astral-sh/ruff/issues/10905.
This commit is contained in:
parent
2d6978f236
commit
ec3243a6e5
2 changed files with 70 additions and 14 deletions
|
@ -1284,3 +1284,49 @@ fn negated_per_file_ignores_overlap() -> Result<()> {
|
||||||
"###);
|
"###);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unused_interaction() -> Result<()> {
|
||||||
|
let tempdir = TempDir::new()?;
|
||||||
|
let ruff_toml = tempdir.path().join("ruff.toml");
|
||||||
|
fs::write(
|
||||||
|
&ruff_toml,
|
||||||
|
r#"
|
||||||
|
[lint]
|
||||||
|
select = ["F"]
|
||||||
|
"#,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
insta::with_settings!({
|
||||||
|
filters => vec![(tempdir_filter(&tempdir).as_str(), "[TMP]/")]
|
||||||
|
}, {
|
||||||
|
assert_cmd_snapshot!(Command::new(get_cargo_bin(BIN_NAME))
|
||||||
|
.args(STDIN_BASE_OPTIONS)
|
||||||
|
.arg("--config")
|
||||||
|
.arg(&ruff_toml)
|
||||||
|
.args(["--stdin-filename", "test.py"])
|
||||||
|
.arg("--fix")
|
||||||
|
.arg("-")
|
||||||
|
.pass_stdin(r#"
|
||||||
|
import os # F401
|
||||||
|
|
||||||
|
def function():
|
||||||
|
import os # F811
|
||||||
|
print(os.name)
|
||||||
|
"#), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
import os # F401
|
||||||
|
|
||||||
|
def function():
|
||||||
|
print(os.name)
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Found 1 error (1 fixed, 0 remaining).
|
||||||
|
"###);
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
|
@ -129,8 +129,18 @@ fn apply_fixes<'a>(
|
||||||
|
|
||||||
/// Compare two fixes.
|
/// Compare two fixes.
|
||||||
fn cmp_fix(rule1: Rule, rule2: Rule, fix1: &Fix, fix2: &Fix) -> std::cmp::Ordering {
|
fn cmp_fix(rule1: Rule, rule2: Rule, fix1: &Fix, fix2: &Fix) -> std::cmp::Ordering {
|
||||||
fix1.min_start()
|
// Always apply `RedefinedWhileUnused` before `UnusedImport`, as the latter can end up fixing
|
||||||
.cmp(&fix2.min_start())
|
// the former.
|
||||||
|
{
|
||||||
|
match (rule1, rule2) {
|
||||||
|
(Rule::RedefinedWhileUnused, Rule::UnusedImport) => return std::cmp::Ordering::Less,
|
||||||
|
(Rule::UnusedImport, Rule::RedefinedWhileUnused) => return std::cmp::Ordering::Greater,
|
||||||
|
_ => std::cmp::Ordering::Equal,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Apply fixes in order of their start position.
|
||||||
|
.then_with(|| fix1.min_start().cmp(&fix2.min_start()))
|
||||||
|
// Break ties in the event of overlapping rules, for some specific combinations.
|
||||||
.then_with(|| match (&rule1, &rule2) {
|
.then_with(|| match (&rule1, &rule2) {
|
||||||
// Apply `EndsInPeriod` fixes before `NewLineAfterLastParagraph` fixes.
|
// Apply `EndsInPeriod` fixes before `NewLineAfterLastParagraph` fixes.
|
||||||
(Rule::EndsInPeriod, Rule::NewLineAfterLastParagraph) => std::cmp::Ordering::Less,
|
(Rule::EndsInPeriod, Rule::NewLineAfterLastParagraph) => std::cmp::Ordering::Less,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue