diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_simplify/SIM101.py b/crates/ruff_linter/resources/test/fixtures/flake8_simplify/SIM101.py index 12e26c4c76..7863c77e63 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_simplify/SIM101.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_simplify/SIM101.py @@ -48,3 +48,7 @@ def f(): if isinstance(a, int) or isinstance(a, float): pass + +# Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722460483 +if(isinstance(a, int)) or (isinstance(a, float)): + pass diff --git a/crates/ruff_linter/resources/test/fixtures/pylint/repeated_isinstance_calls.py b/crates/ruff_linter/resources/test/fixtures/pylint/repeated_isinstance_calls.py deleted file mode 100644 index d2a6dc11da..0000000000 --- a/crates/ruff_linter/resources/test/fixtures/pylint/repeated_isinstance_calls.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Checks use of consider-merging-isinstance""" -# pylint:disable=line-too-long, simplifiable-condition - - -def isinstances(): - "Examples of isinstances" - var = range(10) - - # merged - if isinstance(var[1], (int, float)): - pass - result = isinstance(var[2], (int, float)) - - # not merged - if isinstance(var[3], int) or isinstance(var[3], float) or isinstance(var[3], list) and True: # [consider-merging-isinstance] - pass - result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] - - result = isinstance(var[5], int) or True or isinstance(var[5], float) # [consider-merging-isinstance] - - inferred_isinstance = isinstance - result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] - result = isinstance(var[10], str) or isinstance(var[10], int) and var[8] * 14 or isinstance(var[10], float) and var[5] * 14.4 or isinstance(var[10], list) # [consider-merging-isinstance] - result = isinstance(var[11], int) or isinstance(var[11], int) or isinstance(var[11], float) # [consider-merging-isinstance] - - result = isinstance(var[20]) - result = isinstance() - - # Combination merged and not merged - result = isinstance(var[12], (int, float)) or isinstance(var[12], list) # [consider-merging-isinstance] - - # not merged but valid - result = isinstance(var[5], int) and var[5] * 14 or isinstance(var[5], float) and var[5] * 14.4 - result = isinstance(var[7], int) or not isinstance(var[7], float) - result = isinstance(var[6], int) or isinstance(var[7], float) - result = isinstance(var[6], int) or isinstance(var[7], int) - result = isinstance(var[6], (float, int)) or False - return result - - -# Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722460483 -if(isinstance(self.k, int)) or (isinstance(self.k, float)): - ... diff --git a/crates/ruff_linter/src/checkers/ast/analyze/expression.rs b/crates/ruff_linter/src/checkers/ast/analyze/expression.rs index 9c12ac0333..3b23e7cae9 100644 --- a/crates/ruff_linter/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff_linter/src/checkers/ast/analyze/expression.rs @@ -1515,16 +1515,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { refurb::rules::reimplemented_starmap(checker, &generator.into()); } } - Expr::BoolOp( - bool_op @ ast::ExprBoolOp { - op, - values, - range: _, - }, - ) => { - if checker.enabled(Rule::RepeatedIsinstanceCalls) { - pylint::rules::repeated_isinstance_calls(checker, expr, *op, values); - } + Expr::BoolOp(bool_op) => { if checker.enabled(Rule::MultipleStartsEndsWith) { flake8_pie::rules::multiple_starts_ends_with(checker, expr); } diff --git a/crates/ruff_linter/src/codes.rs b/crates/ruff_linter/src/codes.rs index 5cfea34a37..781b48240b 100644 --- a/crates/ruff_linter/src/codes.rs +++ b/crates/ruff_linter/src/codes.rs @@ -248,7 +248,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> { (Pylint, "R0915") => (RuleGroup::Stable, rules::pylint::rules::TooManyStatements), (Pylint, "R0916") => (RuleGroup::Preview, rules::pylint::rules::TooManyBooleanExpressions), (Pylint, "R0917") => (RuleGroup::Preview, rules::pylint::rules::TooManyPositional), - (Pylint, "R1701") => (RuleGroup::Stable, rules::pylint::rules::RepeatedIsinstanceCalls), + (Pylint, "R1701") => (RuleGroup::Removed, rules::pylint::rules::RepeatedIsinstanceCalls), (Pylint, "R1702") => (RuleGroup::Preview, rules::pylint::rules::TooManyNestedBlocks), (Pylint, "R1704") => (RuleGroup::Preview, rules::pylint::rules::RedefinedArgumentFromLocal), (Pylint, "R1706") => (RuleGroup::Removed, rules::pylint::rules::AndOrTernary), diff --git a/crates/ruff_linter/src/rule_redirects.rs b/crates/ruff_linter/src/rule_redirects.rs index 85c120e2d3..4e74fca893 100644 --- a/crates/ruff_linter/src/rule_redirects.rs +++ b/crates/ruff_linter/src/rule_redirects.rs @@ -103,6 +103,8 @@ static REDIRECTS: Lazy> = Lazy::new(|| { ("TRY200", "B904"), ("PGH001", "S307"), ("PGH002", "G010"), + // Removed in v0.5 + ("PLR1701", "SIM101"), // Test redirect by exact code #[cfg(any(feature = "test-rules", test))] ("RUF940", "RUF950"), diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs index 32b1d19578..9e64c26178 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs @@ -15,6 +15,7 @@ use ruff_python_codegen::Generator; use ruff_python_semantic::SemanticModel; use crate::checkers::ast::Checker; +use crate::fix::edits::pad; /// ## What it does /// Checks for multiple `isinstance` calls on the same target. @@ -404,7 +405,7 @@ pub(crate) fn duplicate_isinstance_call(checker: &mut Checker, expr: &Expr) { .collect(); // Generate a single `isinstance` call. - let node = ast::ExprTuple { + let tuple = ast::ExprTuple { // Flatten all the types used across the `isinstance` calls. elts: types .iter() @@ -421,21 +422,23 @@ pub(crate) fn duplicate_isinstance_call(checker: &mut Checker, expr: &Expr) { range: TextRange::default(), parenthesized: true, }; - let node1 = ast::ExprName { - id: "isinstance".into(), - ctx: ExprContext::Load, - range: TextRange::default(), - }; - let node2 = ast::ExprCall { - func: Box::new(node1.into()), + let isinstance_call = ast::ExprCall { + func: Box::new( + ast::ExprName { + id: "isinstance".into(), + ctx: ExprContext::Load, + range: TextRange::default(), + } + .into(), + ), arguments: Arguments { - args: Box::from([target.clone(), node.into()]), + args: Box::from([target.clone(), tuple.into()]), keywords: Box::from([]), range: TextRange::default(), }, range: TextRange::default(), - }; - let call = node2.into(); + } + .into(); // Generate the combined `BoolOp`. let [first, .., last] = indices.as_slice() else { @@ -443,17 +446,21 @@ pub(crate) fn duplicate_isinstance_call(checker: &mut Checker, expr: &Expr) { }; let before = values.iter().take(*first).cloned(); let after = values.iter().skip(last + 1).cloned(); - let node = ast::ExprBoolOp { + let bool_op = ast::ExprBoolOp { op: BoolOp::Or, - values: before.chain(iter::once(call)).chain(after).collect(), + values: before + .chain(iter::once(isinstance_call)) + .chain(after) + .collect(), range: TextRange::default(), - }; - let bool_op = node.into(); + } + .into(); + let fixed_source = checker.generator().expr(&bool_op); // Populate the `Fix`. Replace the _entire_ `BoolOp`. Note that if we have // multiple duplicates, the fixes will conflict. diagnostic.set_fix(Fix::unsafe_edit(Edit::range_replacement( - checker.generator().expr(&bool_op), + pad(fixed_source, expr.range(), checker.locator()), expr.range(), ))); } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/snapshots/ruff_linter__rules__flake8_simplify__tests__SIM101_SIM101.py.snap b/crates/ruff_linter/src/rules/flake8_simplify/snapshots/ruff_linter__rules__flake8_simplify__tests__SIM101_SIM101.py.snap index 59449d8ae6..7fe5ffe88b 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/snapshots/ruff_linter__rules__flake8_simplify__tests__SIM101_SIM101.py.snap +++ b/crates/ruff_linter/src/rules/flake8_simplify/snapshots/ruff_linter__rules__flake8_simplify__tests__SIM101_SIM101.py.snap @@ -166,4 +166,19 @@ SIM101.py:41:4: SIM101 [*] Multiple `isinstance` calls for `a`, merge into a sin 43 43 | 44 44 | def f(): +SIM101.py:53:3: SIM101 [*] Multiple `isinstance` calls for `a`, merge into a single call + | +52 | # Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722460483 +53 | if(isinstance(a, int)) or (isinstance(a, float)): + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM101 +54 | pass + | + = help: Merge `isinstance` calls for `a` +ℹ Unsafe fix +50 50 | pass +51 51 | +52 52 | # Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722460483 +53 |-if(isinstance(a, int)) or (isinstance(a, float)): + 53 |+if isinstance(a, (int, float)): +54 54 | pass diff --git a/crates/ruff_linter/src/rules/pylint/mod.rs b/crates/ruff_linter/src/rules/pylint/mod.rs index c65624ae57..ea86e99536 100644 --- a/crates/ruff_linter/src/rules/pylint/mod.rs +++ b/crates/ruff_linter/src/rules/pylint/mod.rs @@ -39,10 +39,6 @@ mod tests { #[test_case(Rule::CollapsibleElseIf, Path::new("collapsible_else_if.py"))] #[test_case(Rule::CompareToEmptyString, Path::new("compare_to_empty_string.py"))] #[test_case(Rule::ComparisonOfConstant, Path::new("comparison_of_constant.py"))] - #[test_case( - Rule::RepeatedIsinstanceCalls, - Path::new("repeated_isinstance_calls.py") - )] #[test_case(Rule::ComparisonWithItself, Path::new("comparison_with_itself.py"))] #[test_case(Rule::EqWithoutHash, Path::new("eq_without_hash.py"))] #[test_case(Rule::EmptyComment, Path::new("empty_comment.py"))] @@ -229,17 +225,6 @@ mod tests { Ok(()) } - #[test] - fn repeated_isinstance_calls() -> Result<()> { - let diagnostics = test_path( - Path::new("pylint/repeated_isinstance_calls.py"), - &LinterSettings::for_rule(Rule::RepeatedIsinstanceCalls) - .with_target_version(PythonVersion::Py39), - )?; - assert_messages!(diagnostics); - Ok(()) - } - #[test] fn continue_in_finally() -> Result<()> { let diagnostics = test_path( diff --git a/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs b/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs index 1b51c920ad..b54224617f 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs @@ -1,18 +1,11 @@ -use itertools::Itertools; -use ruff_python_ast::{self as ast, Arguments, BoolOp, Expr}; -use rustc_hash::{FxHashMap, FxHashSet}; - -use crate::fix::edits::pad; -use crate::fix::snippet::SourceCodeSnippet; -use ruff_diagnostics::{AlwaysFixableViolation, Applicability, Diagnostic, Edit, Fix}; +use ruff_diagnostics::AlwaysFixableViolation; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::hashable::HashableExpr; -use ruff_text_size::Ranged; -use crate::checkers::ast::Checker; - -use crate::settings::types::PythonVersion; +use crate::fix::snippet::SourceCodeSnippet; +/// ## Removed +/// This rule is identical to [SIM101] which should be used instead. +/// /// ## What it does /// Checks for repeated `isinstance` calls on the same object. /// @@ -53,11 +46,14 @@ use crate::settings::types::PythonVersion; /// /// ## References /// - [Python documentation: `isinstance`](https://docs.python.org/3/library/functions.html#isinstance) +/// +/// [SIM101]: https://docs.astral.sh/ruff/rules/duplicate-isinstance-call/ #[violation] pub struct RepeatedIsinstanceCalls { expression: SourceCodeSnippet, } +// PLR1701 impl AlwaysFixableViolation for RepeatedIsinstanceCalls { #[derive_message_formats] fn message(&self) -> String { @@ -78,88 +74,3 @@ impl AlwaysFixableViolation for RepeatedIsinstanceCalls { } } } - -/// PLR1701 -pub(crate) fn repeated_isinstance_calls( - checker: &mut Checker, - expr: &Expr, - op: BoolOp, - values: &[Expr], -) { - if !op.is_or() { - return; - } - - let mut obj_to_types: FxHashMap)> = - FxHashMap::default(); - for value in values { - let Expr::Call(ast::ExprCall { - func, - arguments: Arguments { args, .. }, - .. - }) = value - else { - continue; - }; - let [obj, types] = &args[..] else { - continue; - }; - if !checker.semantic().match_builtin_expr(func, "isinstance") { - continue; - } - let (num_calls, matches) = obj_to_types - .entry(obj.into()) - .or_insert_with(|| (0, FxHashSet::default())); - - *num_calls += 1; - matches.extend(match types { - Expr::Tuple(ast::ExprTuple { elts, .. }) => { - elts.iter().map(HashableExpr::from_expr).collect() - } - _ => { - vec![types.into()] - } - }); - } - - for (obj, (num_calls, types)) in obj_to_types { - if num_calls > 1 && types.len() > 1 { - let call = merged_isinstance_call( - &checker.generator().expr(obj.as_expr()), - types - .iter() - .map(HashableExpr::as_expr) - .map(|expr| checker.generator().expr(expr)) - .sorted(), - checker.settings.target_version, - ); - let mut diagnostic = Diagnostic::new( - RepeatedIsinstanceCalls { - expression: SourceCodeSnippet::new(call.clone()), - }, - expr.range(), - ); - diagnostic.set_fix(Fix::applicable_edit( - Edit::range_replacement(pad(call, expr.range(), checker.locator()), expr.range()), - if checker.settings.target_version >= PythonVersion::Py310 { - Applicability::Unsafe - } else { - Applicability::Safe - }, - )); - checker.diagnostics.push(diagnostic); - } - } -} - -fn merged_isinstance_call( - obj: &str, - types: impl IntoIterator, - target_version: PythonVersion, -) -> String { - if target_version >= PythonVersion::Py310 { - format!("isinstance({}, {})", obj, types.into_iter().join(" | ")) - } else { - format!("isinstance({}, ({}))", obj, types.into_iter().join(", ")) - } -} diff --git a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLR1701_repeated_isinstance_calls.py.snap b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLR1701_repeated_isinstance_calls.py.snap deleted file mode 100644 index e4f1bdf206..0000000000 --- a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLR1701_repeated_isinstance_calls.py.snap +++ /dev/null @@ -1,142 +0,0 @@ ---- -source: crates/ruff_linter/src/rules/pylint/mod.rs ---- -repeated_isinstance_calls.py:15:8: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[3], float | int)` - | -14 | # not merged -15 | if isinstance(var[3], int) or isinstance(var[3], float) or isinstance(var[3], list) and True: # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -16 | pass -17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] - | - = help: Replace with `isinstance(var[3], float | int)` - -ℹ Unsafe fix -12 12 | result = isinstance(var[2], (int, float)) -13 13 | -14 14 | # not merged -15 |- if isinstance(var[3], int) or isinstance(var[3], float) or isinstance(var[3], list) and True: # [consider-merging-isinstance] - 15 |+ if isinstance(var[3], float | int): # [consider-merging-isinstance] -16 16 | pass -17 17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] -18 18 | - -repeated_isinstance_calls.py:17:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[4], float | int)` - | -15 | if isinstance(var[3], int) or isinstance(var[3], float) or isinstance(var[3], list) and True: # [consider-merging-isinstance] -16 | pass -17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -18 | -19 | result = isinstance(var[5], int) or True or isinstance(var[5], float) # [consider-merging-isinstance] - | - = help: Replace with `isinstance(var[4], float | int)` - -ℹ Unsafe fix -14 14 | # not merged -15 15 | if isinstance(var[3], int) or isinstance(var[3], float) or isinstance(var[3], list) and True: # [consider-merging-isinstance] -16 16 | pass -17 |- result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] - 17 |+ result = isinstance(var[4], float | int) # [consider-merging-isinstance] -18 18 | -19 19 | result = isinstance(var[5], int) or True or isinstance(var[5], float) # [consider-merging-isinstance] -20 20 | - -repeated_isinstance_calls.py:19:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[5], float | int)` - | -17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] -18 | -19 | result = isinstance(var[5], int) or True or isinstance(var[5], float) # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -20 | -21 | inferred_isinstance = isinstance - | - = help: Replace with `isinstance(var[5], float | int)` - -ℹ Unsafe fix -16 16 | pass -17 17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] -18 18 | -19 |- result = isinstance(var[5], int) or True or isinstance(var[5], float) # [consider-merging-isinstance] - 19 |+ result = isinstance(var[5], float | int) # [consider-merging-isinstance] -20 20 | -21 21 | inferred_isinstance = isinstance -22 22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] - -repeated_isinstance_calls.py:23:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[10], list | str)` - | -21 | inferred_isinstance = isinstance -22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] -23 | result = isinstance(var[10], str) or isinstance(var[10], int) and var[8] * 14 or isinstance(var[10], float) and var[5] * 14.4 or isinstance(var[10], list) # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -24 | result = isinstance(var[11], int) or isinstance(var[11], int) or isinstance(var[11], float) # [consider-merging-isinstance] - | - = help: Replace with `isinstance(var[10], list | str)` - -ℹ Unsafe fix -20 20 | -21 21 | inferred_isinstance = isinstance -22 22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] -23 |- result = isinstance(var[10], str) or isinstance(var[10], int) and var[8] * 14 or isinstance(var[10], float) and var[5] * 14.4 or isinstance(var[10], list) # [consider-merging-isinstance] - 23 |+ result = isinstance(var[10], list | str) # [consider-merging-isinstance] -24 24 | result = isinstance(var[11], int) or isinstance(var[11], int) or isinstance(var[11], float) # [consider-merging-isinstance] -25 25 | -26 26 | result = isinstance(var[20]) - -repeated_isinstance_calls.py:24:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[11], float | int)` - | -22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] -23 | result = isinstance(var[10], str) or isinstance(var[10], int) and var[8] * 14 or isinstance(var[10], float) and var[5] * 14.4 or isinstance(var[10], list) # [consider-merging-isinstance] -24 | result = isinstance(var[11], int) or isinstance(var[11], int) or isinstance(var[11], float) # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -25 | -26 | result = isinstance(var[20]) - | - = help: Replace with `isinstance(var[11], float | int)` - -ℹ Unsafe fix -21 21 | inferred_isinstance = isinstance -22 22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] -23 23 | result = isinstance(var[10], str) or isinstance(var[10], int) and var[8] * 14 or isinstance(var[10], float) and var[5] * 14.4 or isinstance(var[10], list) # [consider-merging-isinstance] -24 |- result = isinstance(var[11], int) or isinstance(var[11], int) or isinstance(var[11], float) # [consider-merging-isinstance] - 24 |+ result = isinstance(var[11], float | int) # [consider-merging-isinstance] -25 25 | -26 26 | result = isinstance(var[20]) -27 27 | result = isinstance() - -repeated_isinstance_calls.py:30:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[12], float | int | list)` - | -29 | # Combination merged and not merged -30 | result = isinstance(var[12], (int, float)) or isinstance(var[12], list) # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -31 | -32 | # not merged but valid - | - = help: Replace with `isinstance(var[12], float | int | list)` - -ℹ Unsafe fix -27 27 | result = isinstance() -28 28 | -29 29 | # Combination merged and not merged -30 |- result = isinstance(var[12], (int, float)) or isinstance(var[12], list) # [consider-merging-isinstance] - 30 |+ result = isinstance(var[12], float | int | list) # [consider-merging-isinstance] -31 31 | -32 32 | # not merged but valid -33 33 | result = isinstance(var[5], int) and var[5] * 14 or isinstance(var[5], float) and var[5] * 14.4 - -repeated_isinstance_calls.py:42:3: PLR1701 [*] Merge `isinstance` calls: `isinstance(self.k, float | int)` - | -41 | # Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722460483 -42 | if(isinstance(self.k, int)) or (isinstance(self.k, float)): - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -43 | ... - | - = help: Replace with `isinstance(self.k, float | int)` - -ℹ Unsafe fix -39 39 | -40 40 | -41 41 | # Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722460483 -42 |-if(isinstance(self.k, int)) or (isinstance(self.k, float)): - 42 |+if isinstance(self.k, float | int): -43 43 | ... diff --git a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__repeated_isinstance_calls.snap b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__repeated_isinstance_calls.snap deleted file mode 100644 index 38edd15cdb..0000000000 --- a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__repeated_isinstance_calls.snap +++ /dev/null @@ -1,142 +0,0 @@ ---- -source: crates/ruff_linter/src/rules/pylint/mod.rs ---- -repeated_isinstance_calls.py:15:8: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[3], (float, int))` - | -14 | # not merged -15 | if isinstance(var[3], int) or isinstance(var[3], float) or isinstance(var[3], list) and True: # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -16 | pass -17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] - | - = help: Replace with `isinstance(var[3], (float, int))` - -ℹ Safe fix -12 12 | result = isinstance(var[2], (int, float)) -13 13 | -14 14 | # not merged -15 |- if isinstance(var[3], int) or isinstance(var[3], float) or isinstance(var[3], list) and True: # [consider-merging-isinstance] - 15 |+ if isinstance(var[3], (float, int)): # [consider-merging-isinstance] -16 16 | pass -17 17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] -18 18 | - -repeated_isinstance_calls.py:17:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[4], (float, int))` - | -15 | if isinstance(var[3], int) or isinstance(var[3], float) or isinstance(var[3], list) and True: # [consider-merging-isinstance] -16 | pass -17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -18 | -19 | result = isinstance(var[5], int) or True or isinstance(var[5], float) # [consider-merging-isinstance] - | - = help: Replace with `isinstance(var[4], (float, int))` - -ℹ Safe fix -14 14 | # not merged -15 15 | if isinstance(var[3], int) or isinstance(var[3], float) or isinstance(var[3], list) and True: # [consider-merging-isinstance] -16 16 | pass -17 |- result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] - 17 |+ result = isinstance(var[4], (float, int)) # [consider-merging-isinstance] -18 18 | -19 19 | result = isinstance(var[5], int) or True or isinstance(var[5], float) # [consider-merging-isinstance] -20 20 | - -repeated_isinstance_calls.py:19:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[5], (float, int))` - | -17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] -18 | -19 | result = isinstance(var[5], int) or True or isinstance(var[5], float) # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -20 | -21 | inferred_isinstance = isinstance - | - = help: Replace with `isinstance(var[5], (float, int))` - -ℹ Safe fix -16 16 | pass -17 17 | result = isinstance(var[4], int) or isinstance(var[4], float) or isinstance(var[5], list) and False # [consider-merging-isinstance] -18 18 | -19 |- result = isinstance(var[5], int) or True or isinstance(var[5], float) # [consider-merging-isinstance] - 19 |+ result = isinstance(var[5], (float, int)) # [consider-merging-isinstance] -20 20 | -21 21 | inferred_isinstance = isinstance -22 22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] - -repeated_isinstance_calls.py:23:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[10], (list, str))` - | -21 | inferred_isinstance = isinstance -22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] -23 | result = isinstance(var[10], str) or isinstance(var[10], int) and var[8] * 14 or isinstance(var[10], float) and var[5] * 14.4 or isinstance(var[10], list) # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -24 | result = isinstance(var[11], int) or isinstance(var[11], int) or isinstance(var[11], float) # [consider-merging-isinstance] - | - = help: Replace with `isinstance(var[10], (list, str))` - -ℹ Safe fix -20 20 | -21 21 | inferred_isinstance = isinstance -22 22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] -23 |- result = isinstance(var[10], str) or isinstance(var[10], int) and var[8] * 14 or isinstance(var[10], float) and var[5] * 14.4 or isinstance(var[10], list) # [consider-merging-isinstance] - 23 |+ result = isinstance(var[10], (list, str)) # [consider-merging-isinstance] -24 24 | result = isinstance(var[11], int) or isinstance(var[11], int) or isinstance(var[11], float) # [consider-merging-isinstance] -25 25 | -26 26 | result = isinstance(var[20]) - -repeated_isinstance_calls.py:24:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[11], (float, int))` - | -22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] -23 | result = isinstance(var[10], str) or isinstance(var[10], int) and var[8] * 14 or isinstance(var[10], float) and var[5] * 14.4 or isinstance(var[10], list) # [consider-merging-isinstance] -24 | result = isinstance(var[11], int) or isinstance(var[11], int) or isinstance(var[11], float) # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -25 | -26 | result = isinstance(var[20]) - | - = help: Replace with `isinstance(var[11], (float, int))` - -ℹ Safe fix -21 21 | inferred_isinstance = isinstance -22 22 | result = inferred_isinstance(var[6], int) or inferred_isinstance(var[6], float) or inferred_isinstance(var[6], list) and False # [consider-merging-isinstance] -23 23 | result = isinstance(var[10], str) or isinstance(var[10], int) and var[8] * 14 or isinstance(var[10], float) and var[5] * 14.4 or isinstance(var[10], list) # [consider-merging-isinstance] -24 |- result = isinstance(var[11], int) or isinstance(var[11], int) or isinstance(var[11], float) # [consider-merging-isinstance] - 24 |+ result = isinstance(var[11], (float, int)) # [consider-merging-isinstance] -25 25 | -26 26 | result = isinstance(var[20]) -27 27 | result = isinstance() - -repeated_isinstance_calls.py:30:14: PLR1701 [*] Merge `isinstance` calls: `isinstance(var[12], (float, int, list))` - | -29 | # Combination merged and not merged -30 | result = isinstance(var[12], (int, float)) or isinstance(var[12], list) # [consider-merging-isinstance] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -31 | -32 | # not merged but valid - | - = help: Replace with `isinstance(var[12], (float, int, list))` - -ℹ Safe fix -27 27 | result = isinstance() -28 28 | -29 29 | # Combination merged and not merged -30 |- result = isinstance(var[12], (int, float)) or isinstance(var[12], list) # [consider-merging-isinstance] - 30 |+ result = isinstance(var[12], (float, int, list)) # [consider-merging-isinstance] -31 31 | -32 32 | # not merged but valid -33 33 | result = isinstance(var[5], int) and var[5] * 14 or isinstance(var[5], float) and var[5] * 14.4 - -repeated_isinstance_calls.py:42:3: PLR1701 [*] Merge `isinstance` calls: `isinstance(self.k, (float, int))` - | -41 | # Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722460483 -42 | if(isinstance(self.k, int)) or (isinstance(self.k, float)): - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR1701 -43 | ... - | - = help: Replace with `isinstance(self.k, (float, int))` - -ℹ Safe fix -39 39 | -40 40 | -41 41 | # Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722460483 -42 |-if(isinstance(self.k, int)) or (isinstance(self.k, float)): - 42 |+if isinstance(self.k, (float, int)): -43 43 | ... diff --git a/ruff.schema.json b/ruff.schema.json index 5d390e2408..6a8d7e5807 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -3372,7 +3372,6 @@ "PLR1", "PLR17", "PLR170", - "PLR1701", "PLR1702", "PLR1704", "PLR171",