Skip to content

Commit

Permalink
Format and lint
Browse files Browse the repository at this point in the history
  • Loading branch information
tibor-reiss committed Feb 15, 2024
1 parent df8f755 commit fdd51a4
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 72 deletions.
187 changes: 116 additions & 71 deletions crates/ruff_linter/src/rules/pylint/rules/max_min_instead_of_if.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,41 +82,50 @@ pub(crate) fn min_instead_of_if(checker: &mut Checker, stmt_if: &ast::StmtIf) {
elif_else_clauses,
range: _,
} = stmt_if;

if !elif_else_clauses.is_empty() {return;}


if !elif_else_clauses.is_empty() {
return;
}

let [Stmt::Assign(ast::StmtAssign {
targets: body_targets,
value: body_value,
..
})] = body.as_slice() else {
})] = body.as_slice()
else {
return;
};
let [body_target] = body_targets.as_slice() else {
return;
};

let Some(ast::ExprCompare {
ops,
left,
comparators,
..
}) = test.as_compare_expr() else {
}) = test.as_compare_expr()
else {
return;
};

if !(
!body_target.is_subscript_expr()
&& !left.is_subscript_expr()
) {return;}

if !(!body_target.is_subscript_expr() && !left.is_subscript_expr()) {
return;
}

let ([op], [right_statement]) = (&**ops, &**comparators) else {
return;
};

if !matches!(op, CmpOp::Gt | CmpOp::GtE) {return;}
if !match_left(left, body_target) {return;}
if !match_right(right_statement, body_value) {return;}
if !matches!(op, CmpOp::Gt | CmpOp::GtE) {
return;
}
if !match_left(left, body_target) {
return;
}
if !match_right(right_statement, body_value) {
return;
}

let func_node = ast::ExprName {
id: "min".into(),
Expand Down Expand Up @@ -154,41 +163,50 @@ pub(crate) fn max_instead_of_if(checker: &mut Checker, stmt_if: &ast::StmtIf) {
elif_else_clauses,
range: _,
} = stmt_if;

if !elif_else_clauses.is_empty() {return;}


if !elif_else_clauses.is_empty() {
return;
}

let [Stmt::Assign(ast::StmtAssign {
targets: body_targets,
value: body_value,
..
})] = body.as_slice() else {
})] = body.as_slice()
else {
return;
};
let [body_target] = body_targets.as_slice() else {
return;
};

let Some(ast::ExprCompare {
ops,
left,
comparators,
..
}) = test.as_compare_expr() else {
}) = test.as_compare_expr()
else {
return;
};

if !(
!body_target.is_subscript_expr()
&& !left.is_subscript_expr()
) {return;}

if !(!body_target.is_subscript_expr() && !left.is_subscript_expr()) {
return;
}

let ([op], [right_statement]) = (&**ops, &**comparators) else {
return;
};

if !matches!(op, CmpOp::Lt | CmpOp::LtE) {return;}
if !match_left(left, body_target) {return;}
if !match_right(right_statement, body_value) {return;}
if !matches!(op, CmpOp::Lt | CmpOp::LtE) {
return;
}
if !match_left(left, body_target) {
return;
}
if !match_right(right_statement, body_value) {
return;
}

let func_node = ast::ExprName {
id: "max".into(),
Expand Down Expand Up @@ -221,75 +239,102 @@ pub(crate) fn max_instead_of_if(checker: &mut Checker, stmt_if: &ast::StmtIf) {
fn match_left(left: &Expr, body_target: &Expr) -> bool {
// Check that the assignments are on the same variable
if left.is_name_expr() && body_target.is_name_expr() {
let Some(left_operand) = left.as_name_expr() else {return false};
let Some(target_assignation) = body_target.as_name_expr() else {return false};
return left_operand.id == target_assignation.id
let Some(left_operand) = left.as_name_expr() else {
return false;
};
let Some(target_assignation) = body_target.as_name_expr() else {
return false;
};
return left_operand.id == target_assignation.id;
}

if left.is_attribute_expr() && body_target.is_attribute_expr() {
let Some(left_operand) = left.as_attribute_expr() else {return false};
let Some(target_assignation) = body_target.as_attribute_expr() else {return false};
return match_attributes(left_operand, target_assignation)
let Some(left_operand) = left.as_attribute_expr() else {
return false;
};
let Some(target_assignation) = body_target.as_attribute_expr() else {
return false;
};
return match_attributes(left_operand, target_assignation);
}

false
}

fn match_right(right_statement: &Expr, body_value: &Box<Expr>) -> bool {
fn match_right(right_statement: &Expr, body_value: &Expr) -> bool {
// Verify that the right part of the statements are the same.
if right_statement.is_name_expr() && body_value.is_name_expr() {
let Some(right_statement_value) = right_statement.as_name_expr() else {return false};
let Some(body_value_value) = body_value.as_name_expr() else {return false};
return right_statement_value.id == body_value_value.id
let Some(right_statement_value) = right_statement.as_name_expr() else {
return false;
};
let Some(body_value_value) = body_value.as_name_expr() else {
return false;
};
return right_statement_value.id == body_value_value.id;
}
if right_statement.is_literal_expr() && body_value.is_literal_expr() {
let Some(right_statement_value) = right_statement.as_literal_expr() else {return false};
let Some(body_value_value) = body_value.as_literal_expr() else {return false};
let Some(right_statement_value) = right_statement.as_literal_expr() else {
return false;
};
let Some(body_value_value) = body_value.as_literal_expr() else {
return false;
};
match (right_statement_value, body_value_value) {
(
LiteralExpressionRef::BytesLiteral(ast::ExprBytesLiteral{value: value1, ..}),
LiteralExpressionRef::BytesLiteral(ast::ExprBytesLiteral{value: value2, ..})
LiteralExpressionRef::BytesLiteral(ast::ExprBytesLiteral { value: value1, .. }),
LiteralExpressionRef::BytesLiteral(ast::ExprBytesLiteral { value: value2, .. }),
) => {
return value1.iter().map(|b| b.as_slice()).eq(value2.iter().map(|b| b.as_slice()))
},
return value1
.iter()
.map(ruff_python_ast::BytesLiteral::as_slice)
.eq(value2.iter().map(ruff_python_ast::BytesLiteral::as_slice))
}
(
LiteralExpressionRef::StringLiteral(ast::ExprStringLiteral{value: value1, ..}),
LiteralExpressionRef::StringLiteral(ast::ExprStringLiteral{value: value2, ..})
) => {
return value1.to_str() == value2.to_str()
},
LiteralExpressionRef::StringLiteral(ast::ExprStringLiteral {
value: value1, ..
}),
LiteralExpressionRef::StringLiteral(ast::ExprStringLiteral {
value: value2, ..
}),
) => return value1.to_str() == value2.to_str(),
(
LiteralExpressionRef::NumberLiteral(ast::ExprNumberLiteral{value: value1, ..}),
LiteralExpressionRef::NumberLiteral(ast::ExprNumberLiteral{value: value2, ..})
) => {
return value1 == value2
},
(_, _) => {return false}
LiteralExpressionRef::NumberLiteral(ast::ExprNumberLiteral {
value: value1, ..
}),
LiteralExpressionRef::NumberLiteral(ast::ExprNumberLiteral {
value: value2, ..
}),
) => return value1 == value2,
(_, _) => return false,
}
}
false
}

fn match_attributes(expr1: &ExprAttribute, expr2: &ExprAttribute) -> bool {
if expr1.attr.as_str() != expr2.attr.as_str() {return false}

if expr1.attr.as_str() != expr2.attr.as_str() {
return false;
}

if expr1.value.is_name_expr() && expr2.value.is_name_expr() {
let Some(ast::ExprName {
id: id1,
..
}) = expr1.value.as_name_expr() else {return false};
let Some(ast::ExprName {
id: id2,
..
}) = expr2.value.as_name_expr() else {return false};
return id1 == id2
let Some(ast::ExprName { id: id1, .. }) = expr1.value.as_name_expr() else {
return false;
};
let Some(ast::ExprName { id: id2, .. }) = expr2.value.as_name_expr() else {
return false;
};
return id1 == id2;
}

if expr1.value.is_attribute_expr() && expr2.value.is_attribute_expr() {
let Some(expr1) = expr1.value.as_attribute_expr() else {return false;};
let Some(expr2) = expr2.value.as_attribute_expr() else {return false;};
return match_attributes(expr1, expr2)
let Some(expr1) = expr1.value.as_attribute_expr() else {
return false;
};
let Some(expr2) = expr2.value.as_attribute_expr() else {
return false;
};
return match_attributes(expr1, expr2);
}

false
}
2 changes: 1 addition & 1 deletion crates/ruff_linter/src/rules/pylint/rules/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@ mod collapsible_else_if;
mod compare_to_empty_string;
mod comparison_of_constant;
mod comparison_with_itself;
mod max_min_instead_of_if;
mod continue_in_finally;
mod duplicate_bases;
mod empty_comment;
Expand All @@ -121,6 +120,7 @@ mod load_before_global_declaration;
mod logging;
mod magic_value_comparison;
mod manual_import_from;
mod max_min_instead_of_if;
mod misplaced_bare_raise;
mod named_expr_without_context;
mod nested_min_max;
Expand Down

0 comments on commit fdd51a4

Please sign in to comment.