From 1c9cb37afe3cb847254ae03746df27b50317cb36 Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Sun, 12 May 2024 14:43:16 +0530 Subject: [PATCH] Avoid `TCH005` for `if` stmt with `elif`/`else` block --- .../test/fixtures/flake8_type_checking/TCH005.py | 10 ++++++++++ .../ruff_linter/src/checkers/ast/analyze/statement.rs | 5 +---- .../rules/empty_type_checking_block.rs | 9 +++++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_type_checking/TCH005.py b/crates/ruff_linter/resources/test/fixtures/flake8_type_checking/TCH005.py index ee1c43e0ae28f3..7817da6848e46f 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_type_checking/TCH005.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_type_checking/TCH005.py @@ -43,3 +43,13 @@ class Test: if TYPE_CHECKING: pass # TCH005 + +# https://github.com/astral-sh/ruff/issues/11368 +if TYPE_CHECKING: + pass +else: + pass +if TYPE_CHECKING: + pass +elif test: + pass diff --git a/crates/ruff_linter/src/checkers/ast/analyze/statement.rs b/crates/ruff_linter/src/checkers/ast/analyze/statement.rs index cc9fd59ed2b9f7..ddaf1d382523b9 100644 --- a/crates/ruff_linter/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff_linter/src/checkers/ast/analyze/statement.rs @@ -2,7 +2,6 @@ use ruff_diagnostics::Diagnostic; use ruff_python_ast::helpers; use ruff_python_ast::types::Node; use ruff_python_ast::{self as ast, Expr, Stmt}; -use ruff_python_semantic::analyze::typing; use ruff_python_semantic::ScopeKind; use ruff_text_size::Ranged; @@ -1098,9 +1097,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { pylint::rules::too_many_nested_blocks(checker, stmt); } if checker.enabled(Rule::EmptyTypeCheckingBlock) { - if typing::is_type_checking_block(if_, &checker.semantic) { - flake8_type_checking::rules::empty_type_checking_block(checker, if_); - } + flake8_type_checking::rules::empty_type_checking_block(checker, if_); } if checker.enabled(Rule::IfTuple) { pyflakes::rules::if_tuple(checker, if_); diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs index 10ccdd1a9e7e34..23d97b5c2d1ed7 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs @@ -2,6 +2,7 @@ use ruff_python_ast as ast; use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Fix}; use ruff_macros::{derive_message_formats, violation}; +use ruff_python_semantic::analyze::typing; use ruff_text_size::Ranged; use crate::checkers::ast::Checker; @@ -47,6 +48,14 @@ impl AlwaysFixableViolation for EmptyTypeCheckingBlock { /// TCH005 pub(crate) fn empty_type_checking_block(checker: &mut Checker, stmt: &ast::StmtIf) { + if !typing::is_type_checking_block(stmt, checker.semantic()) { + return; + } + + if !stmt.elif_else_clauses.is_empty() { + return; + } + let [stmt] = stmt.body.as_slice() else { return; };