mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-30 13:51:37 +00:00
[red-knot] fix: when simplifying union, True & False -> instance(bool) (#13644)
This commit is contained in:
parent
1c2cafc101
commit
f1205177fd
2 changed files with 29 additions and 3 deletions
|
@ -66,7 +66,7 @@ impl<'db> UnionBuilder<'db> {
|
||||||
let mut to_remove = SmallVec::<[usize; 2]>::new();
|
let mut to_remove = SmallVec::<[usize; 2]>::new();
|
||||||
for (index, element) in self.elements.iter().enumerate() {
|
for (index, element) in self.elements.iter().enumerate() {
|
||||||
if Some(*element) == bool_pair {
|
if Some(*element) == bool_pair {
|
||||||
to_add = KnownClass::Bool.to_class(self.db);
|
to_add = KnownClass::Bool.to_instance(self.db);
|
||||||
to_remove.push(index);
|
to_remove.push(index);
|
||||||
// The type we are adding is a BooleanLiteral, which doesn't have any
|
// The type we are adding is a BooleanLiteral, which doesn't have any
|
||||||
// subtypes. And we just found that the union already contained our
|
// subtypes. And we just found that the union already contained our
|
||||||
|
@ -362,7 +362,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn build_union_bool() {
|
fn build_union_bool() {
|
||||||
let db = setup_db();
|
let db = setup_db();
|
||||||
let bool_ty = KnownClass::Bool.to_class(&db);
|
let bool_instance_ty = KnownClass::Bool.to_instance(&db);
|
||||||
|
|
||||||
let t0 = Type::BooleanLiteral(true);
|
let t0 = Type::BooleanLiteral(true);
|
||||||
let t1 = Type::BooleanLiteral(true);
|
let t1 = Type::BooleanLiteral(true);
|
||||||
|
@ -373,7 +373,7 @@ mod tests {
|
||||||
assert_eq!(union.elements(&db), &[t0, t3]);
|
assert_eq!(union.elements(&db), &[t0, t3]);
|
||||||
|
|
||||||
let union = UnionType::from_elements(&db, [t0, t1, t2, t3]).expect_union();
|
let union = UnionType::from_elements(&db, [t0, t1, t2, t3]).expect_union();
|
||||||
assert_eq!(union.elements(&db), &[bool_ty, t3]);
|
assert_eq!(union.elements(&db), &[bool_instance_ty, t3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -4548,6 +4548,32 @@ mod tests {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn simplify_true_and_false_to_bool() -> anyhow::Result<()> {
|
||||||
|
let mut db = setup_db();
|
||||||
|
|
||||||
|
db.write_dedented(
|
||||||
|
"src/a.py",
|
||||||
|
"
|
||||||
|
from typing_extensions import reveal_type
|
||||||
|
|
||||||
|
def returns_bool() -> bool:
|
||||||
|
return True
|
||||||
|
|
||||||
|
if returns_bool():
|
||||||
|
x = True
|
||||||
|
else:
|
||||||
|
x = False
|
||||||
|
|
||||||
|
reveal_type(x)
|
||||||
|
",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
assert_file_diagnostics(&db, "src/a.py", &["Revealed type is `bool`"]);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn literal_int_arithmetic() -> anyhow::Result<()> {
|
fn literal_int_arithmetic() -> anyhow::Result<()> {
|
||||||
let mut db = setup_db();
|
let mut db = setup_db();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue