mirror of
https://github.com/astral-sh/ruff
synced 2026-01-21 05:20:49 -05:00
[ty] Fix incorrect narrowing for if type(x) == y (#22531)
This commit is contained in:
@@ -134,12 +134,17 @@ class IsEqualToEverything(type):
|
||||
class A(metaclass=IsEqualToEverything): ...
|
||||
class B(metaclass=IsEqualToEverything): ...
|
||||
|
||||
def _(x: A | B):
|
||||
def _(x: A | B, y: object):
|
||||
if type(x) == A:
|
||||
reveal_type(x) # revealed: A | B
|
||||
|
||||
if type(x) != A:
|
||||
reveal_type(x) # revealed: A | B
|
||||
|
||||
if type(y) == bool:
|
||||
reveal_type(y) # revealed: object
|
||||
else:
|
||||
reveal_type(y) # revealed: object
|
||||
```
|
||||
|
||||
## No narrowing for custom `type` callable
|
||||
|
||||
@@ -1220,10 +1220,10 @@ impl<'db, 'ast> NarrowingConstraintsBuilder<'db, 'ast> {
|
||||
_ => continue,
|
||||
};
|
||||
|
||||
let is_positive = if is_positive {
|
||||
op == &ast::CmpOp::Is
|
||||
} else {
|
||||
op == &ast::CmpOp::IsNot
|
||||
let is_positive = match op {
|
||||
ast::CmpOp::Is => is_positive,
|
||||
ast::CmpOp::IsNot => !is_positive,
|
||||
_ => continue,
|
||||
};
|
||||
|
||||
// `else`-branch narrowing for `if type(x) is Y` can only be done
|
||||
|
||||
Reference in New Issue
Block a user