mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-04 07:35:01 +00:00
![]() Previously, `Type::object` would find the definition of the `object` class in typeshed, load that in (to produce a `ClassLiteral` and `ClassType`), and then create a `NominalInstance` of that class. It's possible that we are using a typeshed that doesn't define `object`. We will not be able to do much useful work with that kind of typeshed, but it's still a possibility that we have to support at least without panicking. Previously, we would handle this situation by falling back on `Unknown`. In most cases, that's a perfectly fine fallback! But `object` is also our top type — the type of all values. `Unknown` is _not_ an acceptable stand-in for the top type. This PR adds a new `NominalInstance` variant for "instances of `object`". Unlike other nominal instances, we do not need to load in `object`'s `ClassType` to instantiate this variant. We will use this new variant even when the current typeshed does not define an `object` class, ensuring that we have a fully static representation of our top type at all times. There are several operations that need access to a nominal instance's class, and for this new `object` variant we load it lazily only when it's needed. That means this operation is now fallible, since this is where the "typeshed doesn't define `object`" failure shows up. This new approach also has the benefit of avoiding some salsa cycles that were cropping up while I was debugging #20093, since the new constraint set representation was trying to instantiate `Type::object` while in the middle of processing its definition in typeshed. Cycle handling was kicking in correctly and returning the `Unknown` fallback mentioned above. But the constraint set implementation depends on `Type::object` being a distinct and fully static type, highlighting that this is a correctness fix, not just an optimization fix. --------- Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> |
||
---|---|---|
.. | ||
resources | ||
src | ||
tests | ||
build.rs | ||
Cargo.toml | ||
mdtest.py | ||
mdtest.py.lock |