Files
ruff/src/flake8_bugbear/rules/assert_false.rs
2023-01-09 01:39:51 -05:00

61 lines
1.9 KiB
Rust

use rustpython_ast::{Constant, Expr, ExprContext, ExprKind, Location, Stmt, StmtKind};
use crate::ast::types::Range;
use crate::autofix::Fix;
use crate::checkers::ast::Checker;
use crate::registry::Diagnostic;
use crate::source_code_generator::SourceCodeGenerator;
use crate::violations;
fn assertion_error(msg: Option<&Expr>) -> Stmt {
Stmt::new(
Location::default(),
Location::default(),
StmtKind::Raise {
exc: Some(Box::new(Expr::new(
Location::default(),
Location::default(),
ExprKind::Call {
func: Box::new(Expr::new(
Location::default(),
Location::default(),
ExprKind::Name {
id: "AssertionError".to_string(),
ctx: ExprContext::Load,
},
)),
args: if let Some(msg) = msg {
vec![msg.clone()]
} else {
vec![]
},
keywords: vec![],
},
))),
cause: None,
},
)
}
/// B011
pub fn assert_false(checker: &mut Checker, stmt: &Stmt, test: &Expr, msg: Option<&Expr>) {
let ExprKind::Constant {
value: Constant::Bool(false),
..
} = &test.node else {
return;
};
let mut diagnostic = Diagnostic::new(violations::DoNotAssertFalse, Range::from_located(test));
if checker.patch(diagnostic.kind.code()) {
let mut generator: SourceCodeGenerator = checker.style.into();
generator.unparse_stmt(&assertion_error(msg));
diagnostic.amend(Fix::replacement(
generator.generate(),
stmt.location,
stmt.end_location.unwrap(),
));
}
checker.diagnostics.push(diagnostic);
}