Skip to content

Conversation

@manzt
Copy link
Contributor

@manzt manzt commented Mar 31, 2025

Summary

Following up from earlier discussion on Discord, this PR adds logic to flag casts as redundant when the inferred type of the expression is the same as the target type. It should follow the semantics from mypy.

Example:

def f() -> int:
    return 10

# error: [redundant-cast] "Value is already of type `int`"
cast(int, f())

However, I don't think the comparison is quite right yet...there's probably some type comparison behavior I'm misunderstanding. Hopefully it's close enough that the fix is straightforward.

@AlexWaygood AlexWaygood added the ty Multi-file analysis & type inference label Mar 31, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Mar 31, 2025

mypy_primer results

No ecosystem changes detected ✅

Copy link
Contributor

@carljm carljm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, really impressive first PR, thank you! I do have some suggestions, though ;)

@manzt manzt force-pushed the manzt/redunant-cast branch from 8a77256 to adbb233 Compare March 31, 2025 19:26
@manzt manzt force-pushed the manzt/redunant-cast branch from 96a2734 to 2826e31 Compare March 31, 2025 19:44
Copy link
Contributor

@carljm carljm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great!

@carljm carljm enabled auto-merge (squash) March 31, 2025 19:52
auto-merge was automatically disabled March 31, 2025 20:02

Head branch was pushed to by a user without write access

@manzt manzt force-pushed the manzt/redunant-cast branch from c4de6c6 to 26b59eb Compare March 31, 2025 20:03
@AlexWaygood
Copy link
Member

The mypy_primer hits don't look ideal: we may want to special-case Todo types so that a "cast to a Todo type" is never reported as redundant

@manzt
Copy link
Contributor Author

manzt commented Mar 31, 2025

Sorry... I ran cargo and black on the docs to fix the errors.

@carljm
Copy link
Contributor

carljm commented Mar 31, 2025

The mypy_primer hits don't look ideal: we may want to special-case Todo types so that a "cast to a Todo type" is never reported as redundant

Oh yeah, good call. We probably should do that before landing this, to avoid adding new false positives. Looks like we need to special case "Todo type" and "union with todo type" to avoid adding new false positives.

@manzt
Copy link
Contributor Author

manzt commented Mar 31, 2025

Looks like we need to special case "Todo type" and "union with todo type" to avoid adding new false positives.

Would this be some check is_todo_type(source_ty) or some equivalent within infer.rs before deciding to report an error?

@carljm
Copy link
Contributor

carljm commented Mar 31, 2025

We usually just add methods on Type; looks like we already have Type::is_todo but might want to add Type::contains_todo to cover the union case. Then that can be checked in the new clause you added in infer_call_expression.

@manzt
Copy link
Contributor Author

manzt commented Apr 1, 2025

but might want to add Type::contains_todo to cover the union case.

Ok, I think I was able to implement this. I wasn't sure how to specify an explicity Todo type in cast.md to test the case.

@carljm
Copy link
Contributor

carljm commented Apr 1, 2025

I think it's OK not to add a test for this -- it's not important behavior we want to preserve, it's just a temporary thing to reduce false positives from the ecosystem check. So the ecosystem check itself will avoid regression (and whenever it doesn't see any false positives anymore, then we also don't want to keep this code around anymore.)

@carljm carljm enabled auto-merge (squash) April 1, 2025 00:34
@carljm
Copy link
Contributor

carljm commented Apr 1, 2025

Looks great, thanks! And ecosystem check is now reporting no changes. Setting to auto-merge when CI finishes.

@carljm carljm merged commit 53cfaae into astral-sh:main Apr 1, 2025
22 checks passed
@manzt manzt deleted the manzt/redunant-cast branch April 1, 2025 00:39
AlexWaygood added a commit that referenced this pull request Apr 1, 2025
## Summary

There are quite a few places we infer `Todo` types currently, and some
of them are nested somewhat deeply in type expressions. These can cause
spurious issues for the new `redundant-cast` diagnostics. We fixed all
the false positives we saw in the mypy_primer report before merging
#17100, but I think there are
still lots of places where we'd emit false positives due to this check
-- we currently don't run on that many projects at all in our
mypy_primer check:


https://github.com/astral-sh/ruff/blob/d0c8eaa0923352ccc4ec30c9fac1f573f20998b3/.github/workflows/mypy_primer.yaml#L71

This PR fixes some more false positives from this diagnostic by making
the `Type::contains_todo()` method more expansive.

## Test Plan

I added a regression test which causes us to emit a spurious diagnostic
on `main`, but does not with this PR.
dcreager added a commit that referenced this pull request Apr 1, 2025
* main:
  [red-knot] Add property tests for callable types (#17006)
  [red-knot] Disjointness for callable types (#17094)
  [red-knot] Flatten `Type::Callable` into four `Type` variants (#17126)
  mdtest.py: do a full mdtest run immediately when the script is executed (#17128)
  [red-knot] Fix callable subtyping for standard parameters (#17125)
  [red-knot] Fix more `redundant-cast` false positives (#17119)
  Sync vendored typeshed stubs (#17106)
  [red-knot] support Any as a class in typeshed (#17107)
  Visit `Identifier` node as part of the `SourceOrderVisitor` (#17110)
  [red-knot] Don't infer Todo for quite so many tuple type expressions (#17116)
  CI: Run pre-commit on depot machine (#17120)
  Error instead of `panic!` when running Ruff from a deleted directory (#16903) (#17054)
  Control flow graph: setup (#17064)
  [red-knot] Playground improvements (#17109)
  [red-knot] IDE crate (#17045)
  Update dependency vite to v6.2.4 (#17104)
  [red-knot] Add redundant-cast error (#17100)
  [red-knot] Narrowing on `in tuple[...]` and `in str` (#17059)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ty Multi-file analysis & type inference

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants