move all reveal diagnostics to separate line

This commit is contained in:
Douglas Creager 2025-09-23 14:31:30 -04:00
parent 2210bc98b7
commit 6b6937fde5

View file

@ -137,27 +137,47 @@ class Sub(Base): ...
class Unrelated: ... class Unrelated: ...
def unbounded_unconstrained[T, U](t: T, u: U) -> None: def unbounded_unconstrained[T, U](t: T, u: U) -> None:
reveal_type(is_assignable_to(T, T)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(T, object)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_assignable_to(T, T))
reveal_type(is_assignable_to(T, Super)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(T, Any)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_assignable_to(T, object))
reveal_type(is_assignable_to(Any, T)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(U, U)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_assignable_to(T, Super))
reveal_type(is_assignable_to(U, object)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(U, Super)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_assignable_to(T, Any))
reveal_type(is_assignable_to(T, U)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(U, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_assignable_to(Any, T))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(U, U))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(U, object))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(U, Super))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(T, U))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(U, T))
reveal_type(is_subtype_of(T, T)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_subtype_of(T, object)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_subtype_of(T, T))
reveal_type(is_subtype_of(T, Super)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_subtype_of(T, Any)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, object))
reveal_type(is_subtype_of(Any, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U, U)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_subtype_of(T, Super))
reveal_type(is_subtype_of(U, object)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U, Super)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Any))
reveal_type(is_subtype_of(T, U)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(Any, T))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_subtype_of(U, U))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_subtype_of(U, object))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U, Super))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(T, U))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U, T))
``` ```
A bounded typevar is assignable to its bound, and a bounded, fully static typevar is a subtype of A bounded typevar is assignable to its bound, and a bounded, fully static typevar is a subtype of
@ -177,32 +197,52 @@ def bounded[T: Super](t: T) -> None:
reveal_type(is_assignable_to(Any, T)) reveal_type(is_assignable_to(Any, T))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@bounded ≤ Super)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@bounded ≤ Super)]
reveal_type(is_assignable_to(T, Super)) reveal_type(is_assignable_to(T, Super))
reveal_type(is_assignable_to(T, Sub)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(Super, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_assignable_to(T, Sub))
reveal_type(is_assignable_to(Sub, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(Super, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(Sub, T))
reveal_type(is_subtype_of(T, Any)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Any, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Any))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Any, T))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@bounded ≤ Super)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@bounded ≤ Super)]
reveal_type(is_subtype_of(T, Super)) reveal_type(is_subtype_of(T, Super))
reveal_type(is_subtype_of(T, Sub)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Sub))
reveal_type(is_subtype_of(Sub, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Sub, T))
def bounded_by_gradual[T: Any](t: T) -> None: def bounded_by_gradual[T: Any](t: T) -> None:
reveal_type(is_assignable_to(T, Any)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Any, T)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_assignable_to(T, Any))
reveal_type(is_assignable_to(T, Super)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Super, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_assignable_to(Any, T))
reveal_type(is_assignable_to(T, Sub)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Sub, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_assignable_to(T, Super))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(Super, T))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(T, Sub))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(Sub, T))
reveal_type(is_subtype_of(T, Any)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Any, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Any))
reveal_type(is_subtype_of(T, Super)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(Any, T))
reveal_type(is_subtype_of(T, Sub)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Sub, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Super))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(T, Sub))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Sub, T))
@final @final
class FinalClass: ... class FinalClass: ...
@ -214,13 +254,17 @@ def bounded_final[T: FinalClass](t: T) -> None:
reveal_type(is_assignable_to(Any, T)) reveal_type(is_assignable_to(Any, T))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@bounded_final ≤ FinalClass)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@bounded_final ≤ FinalClass)]
reveal_type(is_assignable_to(T, FinalClass)) reveal_type(is_assignable_to(T, FinalClass))
reveal_type(is_assignable_to(FinalClass, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(FinalClass, T))
reveal_type(is_subtype_of(T, Any)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Any, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Any))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Any, T))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@bounded_final ≤ FinalClass)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@bounded_final ≤ FinalClass)]
reveal_type(is_subtype_of(T, FinalClass)) reveal_type(is_subtype_of(T, FinalClass))
reveal_type(is_subtype_of(FinalClass, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(FinalClass, T))
``` ```
Two distinct fully static typevars are not subtypes of each other, even if they have the same Two distinct fully static typevars are not subtypes of each other, even if they have the same
@ -230,18 +274,26 @@ typevars to `Never` in addition to that final class.
```py ```py
def two_bounded[T: Super, U: Super](t: T, u: U) -> None: def two_bounded[T: Super, U: Super](t: T, u: U) -> None:
reveal_type(is_assignable_to(T, U)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(U, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_assignable_to(T, U))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(U, T))
reveal_type(is_subtype_of(T, U)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, U))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U, T))
def two_final_bounded[T: FinalClass, U: FinalClass](t: T, u: U) -> None: def two_final_bounded[T: FinalClass, U: FinalClass](t: T, u: U) -> None:
reveal_type(is_assignable_to(T, U)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(U, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_assignable_to(T, U))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(U, T))
reveal_type(is_subtype_of(T, U)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, U))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U, T))
``` ```
A constrained fully static typevar is assignable to the union of its constraints, but not to any of A constrained fully static typevar is assignable to the union of its constraints, but not to any of
@ -256,7 +308,8 @@ def constrained[T: (Base, Unrelated)](t: T) -> None:
reveal_type(is_assignable_to(T, Super)) reveal_type(is_assignable_to(T, Super))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Base)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Base)]
reveal_type(is_assignable_to(T, Base)) reveal_type(is_assignable_to(T, Base))
reveal_type(is_assignable_to(T, Sub)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(T, Sub))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)]
reveal_type(is_assignable_to(T, Unrelated)) reveal_type(is_assignable_to(T, Unrelated))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)]
@ -269,10 +322,12 @@ def constrained[T: (Base, Unrelated)](t: T) -> None:
reveal_type(is_assignable_to(T, Sub | Unrelated)) reveal_type(is_assignable_to(T, Sub | Unrelated))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)]
reveal_type(is_assignable_to(Any, T)) reveal_type(is_assignable_to(Any, T))
reveal_type(is_assignable_to(Super, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(Super, T))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)]
reveal_type(is_assignable_to(Unrelated, T)) reveal_type(is_assignable_to(Unrelated, T))
reveal_type(is_assignable_to(Super | Unrelated, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_assignable_to(Super | Unrelated, T))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)]
reveal_type(is_assignable_to(Intersection[Base, Unrelated], T)) reveal_type(is_assignable_to(Intersection[Base, Unrelated], T))
@ -280,64 +335,95 @@ def constrained[T: (Base, Unrelated)](t: T) -> None:
reveal_type(is_subtype_of(T, Super)) reveal_type(is_subtype_of(T, Super))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Base)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Base)]
reveal_type(is_subtype_of(T, Base)) reveal_type(is_subtype_of(T, Base))
reveal_type(is_subtype_of(T, Sub)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(T, Sub))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)]
reveal_type(is_subtype_of(T, Unrelated)) reveal_type(is_subtype_of(T, Unrelated))
reveal_type(is_subtype_of(T, Any)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(T, Any))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)]
reveal_type(is_subtype_of(T, Super | Unrelated)) reveal_type(is_subtype_of(T, Super | Unrelated))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)]
reveal_type(is_subtype_of(T, Base | Unrelated)) reveal_type(is_subtype_of(T, Base | Unrelated))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)]
reveal_type(is_subtype_of(T, Sub | Unrelated)) reveal_type(is_subtype_of(T, Sub | Unrelated))
reveal_type(is_subtype_of(Any, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(Any, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super, T))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained = Unrelated)]
reveal_type(is_subtype_of(Unrelated, T)) reveal_type(is_subtype_of(Unrelated, T))
reveal_type(is_subtype_of(Super | Unrelated, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super | Unrelated, T))
# revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (T@constrained = Base) (T@constrained = Unrelated)]
reveal_type(is_subtype_of(Intersection[Base, Unrelated], T)) reveal_type(is_subtype_of(Intersection[Base, Unrelated], T))
def constrained_by_gradual[T: (Base, Any)](t: T) -> None: def constrained_by_gradual[T: (Base, Any)](t: T) -> None:
reveal_type(is_assignable_to(T, Super)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(T, Base)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_assignable_to(T, Super))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(T, Base))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)]
reveal_type(is_assignable_to(T, Sub)) reveal_type(is_assignable_to(T, Sub))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)]
reveal_type(is_assignable_to(T, Unrelated)) reveal_type(is_assignable_to(T, Unrelated))
reveal_type(is_assignable_to(T, Any)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(T, Super | Any)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_assignable_to(T, Any))
reveal_type(is_assignable_to(T, Super | Unrelated)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(T, Super | Any))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(T, Super | Unrelated))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)]
reveal_type(is_assignable_to(Super, T)) reveal_type(is_assignable_to(Super, T))
reveal_type(is_assignable_to(Base, T)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Base, T))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)]
reveal_type(is_assignable_to(Unrelated, T)) reveal_type(is_assignable_to(Unrelated, T))
reveal_type(is_assignable_to(Any, T)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Any, T))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)]
reveal_type(is_assignable_to(Super | Any, T)) reveal_type(is_assignable_to(Super | Any, T))
reveal_type(is_assignable_to(Base | Any, T)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Base | Any, T))
# revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)] # revealed: ty_extensions.ConstraintSet[some valid specializations: (T@constrained_by_gradual ≠ Base)]
reveal_type(is_assignable_to(Super | Unrelated, T)) reveal_type(is_assignable_to(Super | Unrelated, T))
reveal_type(is_assignable_to(Intersection[Base, Unrelated], T)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Intersection[Base, Any], T)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_assignable_to(Intersection[Base, Unrelated], T))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Intersection[Base, Any], T))
reveal_type(is_subtype_of(T, Super)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(T, Base)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Super))
reveal_type(is_subtype_of(T, Sub)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(T, Unrelated)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Base))
reveal_type(is_subtype_of(T, Any)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(T, Super | Any)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Sub))
reveal_type(is_subtype_of(T, Super | Unrelated)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Unrelated))
reveal_type(is_subtype_of(Base, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Unrelated, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Any))
reveal_type(is_subtype_of(Any, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super | Any, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Super | Any))
reveal_type(is_subtype_of(Base | Any, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super | Unrelated, T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T, Super | Unrelated))
reveal_type(is_subtype_of(Intersection[Base, Unrelated], T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Intersection[Base, Any], T)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(Super, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Base, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Unrelated, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Any, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super | Any, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Base | Any, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Super | Unrelated, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Intersection[Base, Unrelated], T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(Intersection[Base, Any], T))
``` ```
Two distinct fully static typevars are not subtypes of each other, even if they have the same Two distinct fully static typevars are not subtypes of each other, even if they have the same
@ -396,8 +482,10 @@ def union_with_dynamic[T: Base, U: (Base, Unrelated)](t: T, u: U) -> None:
# revealed: ty_extensions.ConstraintSet[all valid specializations: (U@union_with_dynamic = Base) (U@union_with_dynamic = Unrelated)] # revealed: ty_extensions.ConstraintSet[all valid specializations: (U@union_with_dynamic = Base) (U@union_with_dynamic = Unrelated)]
reveal_type(is_assignable_to(U | Any, U)) reveal_type(is_assignable_to(U | Any, U))
reveal_type(is_subtype_of(T | Any, T)) # revealed: ty_extensions.ConstraintSet[never] # revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U | Any, U)) # revealed: ty_extensions.ConstraintSet[never] reveal_type(is_subtype_of(T | Any, T))
# revealed: ty_extensions.ConstraintSet[never]
reveal_type(is_subtype_of(U | Any, U))
``` ```
And an intersection of a typevar with another type is always a subtype of the TypeVar: And an intersection of a typevar with another type is always a subtype of the TypeVar:
@ -716,11 +804,15 @@ of) itself.
from ty_extensions import is_assignable_to, is_subtype_of, Not from ty_extensions import is_assignable_to, is_subtype_of, Not
def intersection_is_assignable[T](t: T) -> None: def intersection_is_assignable[T](t: T) -> None:
reveal_type(is_assignable_to(Intersection[T, None], T)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Intersection[T, Not[None]], T)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_assignable_to(Intersection[T, None], T))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_assignable_to(Intersection[T, Not[None]], T))
reveal_type(is_subtype_of(Intersection[T, None], T)) # revealed: ty_extensions.ConstraintSet[always] # revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_subtype_of(Intersection[T, Not[None]], T)) # revealed: ty_extensions.ConstraintSet[always] reveal_type(is_subtype_of(Intersection[T, None], T))
# revealed: ty_extensions.ConstraintSet[always]
reveal_type(is_subtype_of(Intersection[T, Not[None]], T))
``` ```
## Narrowing ## Narrowing