ruff/crates/ty_python_semantic/resources/mdtest
Douglas Creager 83134fb380
[ty] Handle nested types when creating specializations from constraint sets (#21530)
#21414 added the ability to create a specialization from a constraint
set. It handled mutually constrained typevars just fine, e.g. given `T ≤
int ∧ U = T` we can infer `T = int, U = int`.

But it didn't handle _nested_ constraints correctly, e.g. `T ≤ int ∧ U =
list[T]`. Now we do! This requires doing a fixed-point "apply the
specialization to itself" step to propagate the assignments of any
nested typevars, and then a cycle detection check to make sure we don't
have an infinite expansion in the specialization.

This gets at an interesting nuance in our constraint set structure that
@sharkdp has asked about before. Constraint sets are BDDs, and each
internal node represents an _individual constraint_, of the form `lower
≤ T ≤ upper`. `lower` and `upper` are allowed to be other typevars, but
only if they appear "later" in the arbitary ordering that we establish
over typevars. The main purpose of this is to avoid infinite expansion
for mutually constrained typevars.

However, that restriction doesn't help us here, because only applies
when `lower` and `upper` _are_ typevars, not when they _contain_
typevars. That distinction is important, since it means the restriction
does not affect our expressiveness: we can always rewrite `Never ≤ T ≤
U` (a constraint on `T`) into `T ≤ U ≤ object` (a constraint on `U`).
The same is not true of `Never ≤ T ≤ list[U]` — there is no "inverse" of
`list` that we could apply to both sides to transform this into a
constraint on a bare `U`.
2025-11-19 17:37:16 -05:00
..
annotations [ty] Create a specialization from a constraint set (#21414) 2025-11-19 14:20:33 -05:00
assignment [ty] Custom concise diagnostic messages (#21498) 2025-11-18 09:35:40 +01:00
binary [ty] Rename `UnionType` to `types.UnionType` (#21262) 2025-11-03 22:06:56 +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] Reformulation of public symbol inference test suite (#20667) 2025-10-01 14:26:17 +02:00
call [ty] Improve diagnostics when `NotImplemented` is called (#21523) 2025-11-19 19:27:12 +00:00
class [ty] implement `typing.NewType` by adding `Type::NewTypeInstance` 2025-11-10 14:55:47 -08:00
comparison [ty] detect cycles in binary comparison inference (#20446) 2025-09-17 09:45:25 +02:00
comprehensions [ty] fix global symbol lookup from eager scopes (#21317) 2025-11-12 10:15:51 -08:00
conditional [ty] Support as-patterns in reachability analysis (#19728) 2025-08-04 20:13:50 +02:00
dataclasses [ty] Dataclasses: `__hash__` semantics and `unsafe_hash` (#21470) 2025-11-16 09:52:30 +00:00
declaration [ty] Format conflicting types as an enumeration (#18956) 2025-06-26 14:29:33 +02:00
diagnostics [ty] Better invalid-assignment diagnostics (#21476) 2025-11-18 14:31:04 +01:00
directives [ty] Custom concise diagnostic messages (#21498) 2025-11-18 09:35:40 +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] Improve diagnostics for invalid exceptions (#21475) 2025-11-15 22:12:00 +00:00
expression [ty] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00
function [ty] Sync vendored typeshed stubs (#21466) 2025-11-15 17:12:32 +00:00
generics [ty] Handle nested types when creating specializations from constraint sets (#21530) 2025-11-19 17:37:16 -05:00
ide_support [ty] Fixup a few details around version-specific dataclass features (#21453) 2025-11-14 15:04:55 +00:00
import [ty] Consider `from thispackage import y` to re-export `y` in `__init__.pyi` (#21387) 2025-11-11 14:41:14 -05:00
literal [ty] Type inference for genererator expressions (#21437) 2025-11-14 13:04:11 +00:00
loops [ty] Fix bug where ty would think all types had an `__mro__` attribute (#20995) 2025-10-27 11:19:12 +00:00
narrow [ty] Subscript assignment diagnostics follow-up (#21452) 2025-11-17 11:14:58 +00:00
regression [ty] fix global symbol lookup from eager scopes (#21317) 2025-11-12 10:15:51 -08:00
scopes [ty] Make `__getattr__` available for `ModuleType` instances (#21450) 2025-11-14 13:59:14 +01:00
shadowing Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
snapshots [ty] Improve diagnostics when `NotImplemented` is called (#21523) 2025-11-19 19:27:12 +00:00
stubs [ty] Better invalid-assignment diagnostics (#21476) 2025-11-18 14:31:04 +01:00
subscript [ty] Subscript assignment diagnostics follow-up (#21452) 2025-11-17 11:14:58 +00:00
suppressions [ty] Better invalid-assignment diagnostics (#21476) 2025-11-18 14:31:04 +01:00
type_compendium [ty] Improve literal promotion heuristics (#21439) 2025-11-14 16:13:56 -05:00
type_of [ty] Support `type[…]` and `Type[…]` in implicit type aliases (#21421) 2025-11-13 19:02:24 +01:00
type_properties [ty] Better handling of "derived information" in constraint sets (#21463) 2025-11-18 12:02:25 -05:00
type_qualifiers [ty] Fix false positive for Final attribute assignment in __init__ (#21158) 2025-11-11 12:54:05 -08:00
unary Update class literal display to use `<class 'Foo'>` style (#17889) 2025-05-06 20:11:25 -04:00
with [ty] Use `typing.Self` for the first parameter of instance methods (#20517) 2025-09-29 21:08:08 +02: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] Skip eagerly evaluated scopes for attribute storing (#20856) 2025-11-11 14:45:34 -08:00
bidirectional.md [ty] Improve literal promotion heuristics (#21439) 2025-11-14 16:13:56 -05:00
classes.md [ty] Fix bug where ty would think all types had an `__mro__` attribute (#20995) 2025-10-27 11:19:12 +00:00
cycle.md [ty] Avoid ever-growing default types (#20991) 2025-10-21 19:13:36 +02: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] No union with `Unknown` for module-global symbols (#20664) 2025-10-01 16:40:30 +02:00
deprecated.md [ty] Consistent use of American english (in rules) (#19488) 2025-07-22 16:10:38 +02:00
descriptor_protocol.md [ty] Use the return type of `__get__` for descriptor lookups even when `__get__` is called with incorrect arguments (#21424) 2025-11-13 12:05:10 +00:00
enums.md [ty] Custom concise diagnostic messages (#21498) 2025-11-18 09:35:40 +01:00
exhaustiveness_checking.md [ty] Improve exhaustiveness analysis for type variables with bounds or constraints (#21172) 2025-10-31 16:51:11 -04:00
final.md Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
implicit_type_aliases.md [ty] Add tests for generic implicit type aliases (#21522) 2025-11-19 14:06:18 +00: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] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00
invalid_syntax.md [ty] Implicit type aliases: Add support for `typing.Union` (#21363) 2025-11-12 12:59:14 +01:00
known_constants.md Rename Red Knot (#17820) 2025-05-03 19:49:15 +02:00
literal_promotion.md [ty] Improve literal promotion heuristics (#21439) 2025-11-14 16:13:56 -05: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] Sync vendored typeshed stubs (#21466) 2025-11-15 17:12:32 +00:00
named_tuple.md [ty] Fix bug where ty would think all types had an `__mro__` attribute (#20995) 2025-10-27 11:19:12 +00:00
overloads.md [ty] Infer type of `self` for decorated methods and properties (#21123) 2025-10-29 21:22:38 +00:00
paramspec.md [ty] Ensure annotation/type expressions in stub files are always deferred (#21401) 2025-11-13 17:14:54 +00:00
pep613_type_aliases.md [ty] Further improve details around which expressions should be deferred in stub files (#21456) 2025-11-14 21:07:02 +00:00
pep695_type_aliases.md [ty] Add cycle handling to `lazy_default` (#20967) 2025-10-23 10:05:08 +02:00
properties.md [ty] Use the return type of `__get__` for descriptor lookups even when `__get__` is called with incorrect arguments (#21424) 2025-11-13 12:05:10 +00:00
protocols.md [ty] Constraint sets compare generic callables correctly (#21392) 2025-11-17 13:43:37 -05:00
public_types.md [ty] Disambiguate classes that live in different modules but have the same fully qualified names (#20756) 2025-10-08 18:27:40 +01: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] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00
typed_dict.md [ty] Custom concise diagnostic messages (#21498) 2025-11-18 09:35:40 +01:00
union_types.md [ty] Introduce `TypeRelation::Redundancy` (#20602) 2025-10-03 18:35:30 +01:00
unpacking.md [ty] Infer more precise types for collection literals (#20360) 2025-09-17 18:51:50 -04:00
unreachable.md [ty] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00