[red-knot] fix unions of literals, again#17534
Conversation
|
AlexWaygood
left a comment
There was a problem hiding this comment.
Nice! I also confirmed locally that the property tests are no longer flaky (ran them with 2,000,000 iterations 😄)
| /// Return `true` if this type can be a supertype of some literals of `kind` and not others. | ||
| fn splits_literals(self, db: &'db dyn Db, kind: LiteralKind) -> bool { | ||
| match self { | ||
| Type::AlwaysFalsy | Type::AlwaysTruthy => true, |
There was a problem hiding this comment.
I'm slightly concerned about how much special-casing we're adding for Type::AlwaysTruthy and Type::AlwaysFalsy, given that conceptually these are really just two protocol types, and we'll be adding a lot more protocol types to our model very soon... but I guess we (I) can cross that bridge when we (I) come to it :-)
There was a problem hiding this comment.
I think even with the addition of general protocol types, AlwaysTruthy and AlwaysFalsy will remain "special" in that I don't think any other protocol type can "distinguish" between literals of the same kind?
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
fe6f045 to
f215474
Compare
* main: (28 commits) [red-knot] Make `BoundMethodType` a salsa interned (#17581) [red-knot] Emit a diagnostic if a non-protocol is passed to `get_protocol_members` (#17551) [red-knot] Add more tests for protocol members (#17550) [red-knot] Assignability for subclasses of `Any` and `Unknown` (#17557) [red-knot] mypy_primer: add strawberry, print compilation errors to stderr (#17578) [red-knot] GenericAlias instances as a base class (#17575) Remove redundant `type_to_visitor_function` entries (#17564) Fixes how the checker visits `typing.cast`/`typing.NewType` arguments (#17538) [red-knot] Class literal `__new__` function callable subtyping (#17533) [red-knot] Surround intersections with `()` in potentially ambiguous contexts (#17568) [minor] Delete outdated TODO comment (#17565) [red-knot] add regression test for fixed cycle panic (#17535) [red-knot] fix unions of literals, again (#17534) red_knot_python_semantic: remove last vestige of old diagnostics! red_knot_python_semantic: migrate `types` to new diagnostics red_knot_python_semantic: migrate `types/diagnostic` to new diagnostics red_knot_python_semantic: migrate `types/call/bind` to new diagnostics red_knot_python_semantic: migrate `types/string_annotation` to new diagnostics red_knot_python_semantic: migrate `types/infer` to new diagnostic model red_knot_python_semantic: migrate INVALID_ASSIGNMENT for inference ...
…var-instance * dcreager/generic-constructor: (29 commits) We don't need this [red-knot] Make `BoundMethodType` a salsa interned (#17581) [red-knot] Emit a diagnostic if a non-protocol is passed to `get_protocol_members` (#17551) [red-knot] Add more tests for protocol members (#17550) [red-knot] Assignability for subclasses of `Any` and `Unknown` (#17557) [red-knot] mypy_primer: add strawberry, print compilation errors to stderr (#17578) [red-knot] GenericAlias instances as a base class (#17575) Remove redundant `type_to_visitor_function` entries (#17564) Fixes how the checker visits `typing.cast`/`typing.NewType` arguments (#17538) [red-knot] Class literal `__new__` function callable subtyping (#17533) [red-knot] Surround intersections with `()` in potentially ambiguous contexts (#17568) [minor] Delete outdated TODO comment (#17565) [red-knot] add regression test for fixed cycle panic (#17535) [red-knot] fix unions of literals, again (#17534) red_knot_python_semantic: remove last vestige of old diagnostics! red_knot_python_semantic: migrate `types` to new diagnostics red_knot_python_semantic: migrate `types/diagnostic` to new diagnostics red_knot_python_semantic: migrate `types/call/bind` to new diagnostics red_knot_python_semantic: migrate `types/string_annotation` to new diagnostics red_knot_python_semantic: migrate `types/infer` to new diagnostic model ...
Summary
#17451 was incomplete.
AlwaysFalsyandAlwaysTruthyare not the only two types that are super-types of some literals (of a given kind) and not others. That set also includes intersections containingAlwaysTruthyorAlwaysFalsy, and intersections containing literal types of the same kind. Cover these cases as well.Fixes #17478.
Test Plan
Added mdtests.
QUICKCHECK_TESTS=1000000 cargo test -p red_knot_python_semantic -- --ignored types::property_tests::stablefailed on bothall_fully_static_type_pairs_are_subtypes_of_their_unionandall_type_pairs_are_assignable_to_their_unionprior to this PR, passes after it.