Avoid short-circuiting when detecting RET rules (#4002)

This commit is contained in:
Charlie Marsh 2023-04-17 22:52:26 -04:00 committed by GitHub
parent be87a29a9d
commit 79c47e29ee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -463,34 +463,26 @@ fn superfluous_else_node(checker: &mut Checker, stmt: &Stmt, branch: Branch) ->
} }
/// RET505, RET506, RET507, RET508 /// RET505, RET506, RET507, RET508
fn superfluous_elif(checker: &mut Checker, stack: &Stack) -> bool { fn superfluous_elif(checker: &mut Checker, stack: &Stack) {
for stmt in &stack.elifs { for stmt in &stack.elifs {
if superfluous_else_node(checker, stmt, Branch::Elif) { superfluous_else_node(checker, stmt, Branch::Elif);
return true;
} }
} }
false
}
/// RET505, RET506, RET507, RET508 /// RET505, RET506, RET507, RET508
fn superfluous_else(checker: &mut Checker, stack: &Stack) -> bool { fn superfluous_else(checker: &mut Checker, stack: &Stack) {
for stmt in &stack.elses { for stmt in &stack.elses {
if superfluous_else_node(checker, stmt, Branch::Else) { superfluous_else_node(checker, stmt, Branch::Else);
return true;
} }
} }
false
}
/// Run all checks from the `flake8-return` plugin. /// Run all checks from the `flake8-return` plugin.
pub fn function(checker: &mut Checker, body: &[Stmt], returns: Option<&Expr>) { pub fn function(checker: &mut Checker, body: &[Stmt], returns: Option<&Expr>) {
// Skip empty functions.
if body.is_empty() {
return;
}
// Find the last statement in the function. // Find the last statement in the function.
let last_stmt = body.last().unwrap(); let Some(last_stmt) = body.last() else {
// Skip empty functions.
return;
};
// Skip functions that consist of a single return statement. // Skip functions that consist of a single return statement.
if body.len() == 1 && matches!(last_stmt.node, StmtKind::Return { .. }) { if body.len() == 1 && matches!(last_stmt.node, StmtKind::Return { .. }) {
@ -511,20 +503,14 @@ pub fn function(checker: &mut Checker, body: &[Stmt], returns: Option<&Expr>) {
return; return;
} }
if checker.settings.rules.enabled(Rule::SuperfluousElseReturn) if checker.settings.rules.any_enabled(&[
|| checker.settings.rules.enabled(Rule::SuperfluousElseRaise) Rule::SuperfluousElseReturn,
|| checker Rule::SuperfluousElseRaise,
.settings Rule::SuperfluousElseContinue,
.rules Rule::SuperfluousElseBreak,
.enabled(Rule::SuperfluousElseContinue) ]) {
|| checker.settings.rules.enabled(Rule::SuperfluousElseBreak) superfluous_elif(checker, &stack);
{ superfluous_else(checker, &stack);
if superfluous_elif(checker, &stack) {
return;
}
if superfluous_else(checker, &stack) {
return;
}
} }
// Skip any functions without return statements. // Skip any functions without return statements.
@ -532,16 +518,8 @@ pub fn function(checker: &mut Checker, body: &[Stmt], returns: Option<&Expr>) {
return; return;
} }
if !result_exists(&stack.returns) { // If we have at least one non-`None` return...
if checker.settings.rules.enabled(Rule::UnnecessaryReturnNone) { if result_exists(&stack.returns) {
// Skip functions that have a return annotation that is not `None`.
if returns.map_or(true, is_const_none) {
unnecessary_return_none(checker, &stack);
}
}
return;
}
if checker.settings.rules.enabled(Rule::ImplicitReturnValue) { if checker.settings.rules.enabled(Rule::ImplicitReturnValue) {
implicit_return_value(checker, &stack); implicit_return_value(checker, &stack);
} }
@ -556,4 +534,12 @@ pub fn function(checker: &mut Checker, body: &[Stmt], returns: Option<&Expr>) {
} }
} }
} }
} else {
if checker.settings.rules.enabled(Rule::UnnecessaryReturnNone) {
// Skip functions that have a return annotation that is not `None`.
if returns.map_or(true, is_const_none) {
unnecessary_return_none(checker, &stack);
}
}
}
} }