ruff/crates/ty_python_semantic/resources/mdtest
Douglas Creager 02ebb2ee61
[ty] Change to BDD representation for constraint sets (#20533)
While working on #20093, I kept running into test failures due to
constraint sets not simplifying as much as they could, and therefore not
being easily testable against "always true" and "always false".

This PR updates our constraint set representation to use BDDs. Because
BDDs are reduced and ordered, they are canonical — equivalent boolean
formulas are represented by the same interned BDD node.

That said, there is a wrinkle, in that the "variables" that we use in
these BDDs — the individual constraints like `Lower ≤ T ≤ Upper` are not
always independent of each other.

As an example, given types `A ≤ B ≤ C ≤ D` and a typevar `T`, the
constraints `A ≤ T ≤ C` and `B ≤ T ≤ D` "overlap" — their intersection
is non-empty. So we should be able to simplify

```
(A ≤ T ≤ C) ∧ (B ≤ T ≤ D) == (B ≤ T ≤ C)
```

That's not a simplification that the BDD structure can perform itself,
since those three constraints are modeled as separate BDD variables, and
are therefore "opaque" to the BDD algorithms.

That means we need to perform this kind of simplification ourselves. We
look at pairs of constraints that appear in a BDD and see if they can be
simplified relative to each other, and if so, replace the pair with the
simplification. A large part of the toil of getting this PR to work was
identifying all of those patterns and getting that substitution logic
correct.

With this new representation, all existing tests pass, as well as some
new ones that represent test failures that were occuring on #20093.

---------

Co-authored-by: Carl Meyer <carl@astral.sh>
2025-09-25 21:55:35 -04:00
..
annotations [ty] Bind Self typevar to method context (#20366) 2025-09-17 14:58:54 -04:00
assignment [ty] More precise type inference for dictionary literals (#20523) 2025-09-24 18:12:00 -04:00
binary [ty] Remove special casing for string-literal-in-tuple `__contains__` (#19642) 2025-07-31 11:28:03 +01:00
boolean Revert "[ty] Better control flow for boolean expressions that are inside if (#18010)" (#18150) 2025-05-17 08:27:32 -04:00
boundness_declaredness [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
call [ty] Filter overloads using variadic parameters (#20547) 2025-09-25 14:58:00 +00:00
class [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
comparison [ty] detect cycles in binary comparison inference (#20446) 2025-09-17 09:45:25 +02:00
comprehensions [ty] Async for loops and async iterables (#19634) 2025-07-30 17:40:24 +02:00
conditional [ty] Support as-patterns in reachability analysis (#19728) 2025-08-04 20:13:50 +02:00
dataclasses [ty] initial support for `slots=True` in dataclasses (#20278) 2025-09-07 18:25:35 +01:00
declaration [ty] Format conflicting types as an enumeration (#18956) 2025-06-26 14:29:33 +02:00
diagnostics [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
directives [ty] Infer slightly more precise types for comprehensions (#20111) 2025-08-27 13:21:47 +01:00
doc ty_python_semantic: add union type context to function call type errors 2025-05-09 13:40:51 -04:00
exception [ty] Use separate Rust types for bound and unbound type variables (#19796) 2025-08-11 15:29:58 -04:00
expression [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
function [ty] Improve disambiguation of types via fully qualified names (#20141) 2025-08-29 08:44:18 +00:00
generics [ty] Use `C[T]` instead of `C[Unknown]` for the upper bound of `Self` (#20479) 2025-09-23 14:02:25 +02:00
ide_support [`ty`] Include `NamedTupleFallback` members in `NamedTuple` instance completions (#20356) 2025-09-15 11:00:03 +02:00
import [ty] fallback to resolve_real_module in file_to_module (#20461) 2025-09-24 21:15:35 -04:00
literal [ty] More precise type inference for dictionary literals (#20523) 2025-09-24 18:12:00 -04:00
loops [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
narrow [ty] More precise type inference for dictionary literals (#20523) 2025-09-24 18:12:00 -04:00
regression Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
scopes [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
shadowing Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
snapshots [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
stubs [ty] Do not carry the generic context of `Protocol` or `Generic` in the `ClassBase` enum (#17989) 2025-05-22 21:37:03 -04:00
subscript [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
suppressions [ty] Consistent use of American english (in rules) (#19488) 2025-07-22 16:10:38 +02:00
type_compendium [ty] Infer more precise types for collection literals (#20360) 2025-09-17 18:51:50 -04:00
type_of [ty] Improve the `Display` for generic `type[]` types (#19667) 2025-07-31 19:45:01 +01:00
type_properties [ty] Change to BDD representation for constraint sets (#20533) 2025-09-25 21:55:35 -04:00
type_qualifiers [ty] Allow annotation expressions to be `ast::Attribute` nodes (#20413) 2025-09-15 12:06:48 +01:00
unary Update class literal display to use `<class 'Foo'>` style (#17889) 2025-05-06 20:11:25 -04:00
with [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
.mdformat.toml Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
async.md [ty] Support `async`/`await`, `async with` and `yield from` (#19595) 2025-07-30 11:51:21 +02:00
attributes.md [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
classes.md [ty] don't assume that deferred type inference means deferred name resolution (#20160) 2025-08-29 16:19:45 -07:00
cycle.md [ty] Add cycle handling for unpacking targets (#18078) 2025-05-13 21:27:48 +00:00
decorators.md ty_python_semantic: add union type context to function call type errors 2025-05-09 13:40:51 -04:00
del.md [ty] Infer more precise types for collection literals (#20360) 2025-09-17 18:51:50 -04:00
deprecated.md [ty] Consistent use of American english (in rules) (#19488) 2025-07-22 16:10:38 +02:00
descriptor_protocol.md [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
enums.md [ty] implement `auto()` for `StrEnum` (#20524) 2025-09-23 12:22:59 +02:00
exhaustiveness_checking.md [ty] Narrow specialized generics using isinstance() (#20256) 2025-09-04 15:28:33 -07:00
final.md Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
implicit_type_aliases.md [ty] no more diverging query cycles in type expressions (#20359) 2025-09-16 16:44:11 -07:00
instance_layout_conflict.md [ty] initial support for `slots=True` in dataclasses (#20278) 2025-09-07 18:25:35 +01:00
intersection_types.md [ty] Expansion of enums into unions of literals (#19382) 2025-07-21 19:37:55 +02:00
invalid_syntax.md Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
known_constants.md Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
mdtest_config.md Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
mdtest_custom_typeshed.md [ty] Remove `Type::Tuple` (#19669) 2025-08-11 22:03:32 +01:00
metaclass.md Update class literal display to use `<class 'Foo'>` style (#17889) 2025-05-06 20:11:25 -04:00
mro.md [ty] Treat `Hashable`, and similar protocols, equivalently to `object` for subtyping/assignability (#20284) 2025-09-10 11:38:58 +01:00
named_tuple.md [ty] Patch `Self` for fallback-methods on `NamedTuple`s and `TypedDict`s (#20328) 2025-09-15 16:21:53 +02:00
overloads.md [ty] Use `C[T]` instead of `C[Unknown]` for the upper bound of `Self` (#20479) 2025-09-23 14:02:25 +02:00
pep695_type_aliases.md [ty] detect cycles in binary comparison inference (#20446) 2025-09-17 09:45:25 +02:00
properties.md [ty] `"foo".startswith` is not an instance of `types.MethodWrapperType` (#20317) 2025-09-10 11:14:26 +00:00
protocols.md [ty] Remove hack in protocol satisfiability check (#20568) 2025-09-25 13:35:47 +02:00
public_types.md [ty] more precise lazy scope place lookup (#19932) 2025-09-08 21:08:35 +00:00
statically_known_branches.md [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
sys_platform.md Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
sys_version_info.md Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
t_strings.md [ty] Add support for PEP 750 t-strings (#20085) 2025-08-25 18:49:49 +00:00
terminal_statements.md [ty] improve lazy scope place lookup (#19321) 2025-07-25 07:11:11 +00:00
ty_extensions.md [ty] Fix CallableTypeOf[…] for classmethods (#20345) 2025-09-11 10:14:38 +02:00
typed_dict.md [ty] More precise type inference for dictionary literals (#20523) 2025-09-24 18:12:00 -04:00
union_types.md [ty] Simplify unions of enum literals and subtypes thereof (#20324) 2025-09-10 15:54:06 +02:00
unpacking.md [ty] Infer more precise types for collection literals (#20360) 2025-09-17 18:51:50 -04:00
unreachable.md [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00