Commit Graph

459 Commits

Author SHA1 Message Date
David Peter
090563e4a6 Fix comment 2024-12-20 09:18:07 +01:00
David Peter
b37f095f6d Rename to simplify_visibility_constraints 2024-12-20 09:18:07 +01:00
David Peter
91fa462fba scope_start_visibility 2024-12-20 09:18:07 +01:00
David Peter
167337b647 Simplify iterators 2024-12-20 09:18:07 +01:00
David Peter
c3d3437846 Rename 2024-12-20 09:18:07 +01:00
David Peter
8dd5cc5b3e Add cross-module test to show that result is based on type inference 2024-12-20 09:18:07 +01:00
David Peter
32390f3710 Fix doc comments 2024-12-20 09:18:07 +01:00
David Peter
0c6c0ee529 Clippy 2024-12-20 09:18:07 +01:00
David Peter
2beabc61c2 Minor renamings 2024-12-20 09:18:07 +01:00
David Peter
c5e32d937e Finally!! 2024-12-20 09:18:07 +01:00
David Peter
2bbd586725 Rename constraints 2024-12-20 09:18:07 +01:00
David Peter
6c64ae0c05 Rename constraints 2024-12-20 09:18:07 +01:00
David Peter
45d544b601 Document current limitations 2024-12-20 09:18:07 +01:00
David Peter
55330c4ed7 Revert "Fix boolean expressions"
This reverts commit 79a1b6bb52230705c10fe668093316c16444f953.
2024-12-20 09:18:07 +01:00
David Peter
8b60946875 Fix boolean expressions 2024-12-20 09:18:07 +01:00
David Peter
d249801bf2 Implement if-expressions 2024-12-20 09:18:07 +01:00
David Peter
c1748f07d6 Extend sys.platform tests 2024-12-20 09:18:07 +01:00
David Peter
81bfc5227b Clippy 2024-12-20 09:18:07 +01:00
David Peter
9a1d1ea33b sys.platform documentation 2024-12-20 09:18:07 +01:00
David Peter
12f139df87 Reactivate symbol_state tests 2024-12-20 09:18:07 +01:00
David Peter
8a93a9a55a Refactor 2024-12-20 09:18:07 +01:00
David Peter
2e6f757456 Rename, comment 2024-12-20 09:18:07 +01:00
David Peter
853e171ed1 Further cleanup 2024-12-20 09:18:07 +01:00
David Peter
afe1572d7f Rename 2024-12-20 09:18:07 +01:00
David Peter
79b582c584 Refactoring 2024-12-20 09:18:07 +01:00
David Peter
5df51f26cc Minor cleanup 2024-12-20 09:18:07 +01:00
David Peter
4f6fba2cab Introduce VisibilityConstraints struct 2024-12-20 09:18:07 +01:00
David Peter
3a1dbc182f Renamings 2024-12-20 09:18:07 +01:00
David Peter
90e639bd20 Short circuit, increase threshold 2024-12-20 09:18:07 +01:00
David Peter
e044fde784 Add recursion limit hack 2024-12-20 09:18:07 +01:00
David Peter
a37dac1b41 Fix serde feature compilation problem 2024-12-20 09:18:07 +01:00
David Peter
e871ea19e7 Fix boolean expression tests 2024-12-20 09:18:07 +01:00
David Peter
2b12c496ff Fix match control flow 2024-12-20 09:18:07 +01:00
David Peter
c28bcdbc20 Fix match control flow 2024-12-20 09:18:07 +01:00
David Peter
dc9fbaaef1 Add tests for common use cases 2024-12-20 09:18:07 +01:00
David Peter
3d85c7d09c Add support for sys.platform 2024-12-20 09:18:07 +01:00
David Peter
76e277b02a Reset symbol states after if-elif-else chains 2024-12-20 09:18:07 +01:00
David Peter
2042c687b1 Fix string annotation tests 2024-12-20 09:18:07 +01:00
David Peter
7b79a56ea6 Another patch to fix the sys.version_info tests 2024-12-20 09:18:07 +01:00
David Peter
34be5b6b00 Temporarily patch typeshed to avoid cycles 2024-12-20 09:18:07 +01:00
David Peter
e8cfb341f2 [red-knot] Statically known branches 2024-12-20 09:18:07 +01:00
Alex Waygood
3aed14935d [red-knot] Add support for @final classes (#15070)
Co-authored-by: Carl Meyer <carl@astral.sh>
2024-12-19 21:02:14 +00:00
Alex Waygood
bcec5e615b [red-knot] Rename and rework the CoreStdlibModule enum (#15071) 2024-12-19 20:59:00 +00:00
Alex Waygood
a06099dffe [red-knot] Move attribute access on ModuleLiteral types into a dedicated method (#15067) 2024-12-19 16:02:16 +00:00
Alex Waygood
bb43085939 [red-knot] Reduce TODOs in Type::member() (#15066) 2024-12-19 15:54:01 +00:00
Alex Waygood
40cba5dc8a [red-knot] Cleanup various todo_type!() messages (#15063)
Co-authored-by: Micha Reiser <micha@reiser.io>
2024-12-19 13:03:41 +00:00
Douglas Creager
2802cbde29 Don't special-case class instances in unary expression inference (#15045)
We have a handy `to_meta_type` that does the right thing for class
instances, and also works for all of the other types that are “instances
of” something. Unless I'm missing something, this should let us get rid
of the catch-all clause in one fell swoop.

cf #14548
2024-12-18 14:37:17 -05:00
InSync
ed2bce6ebb [red-knot] Report invalid exceptions (#15042)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
2024-12-18 18:31:24 +00:00
Micha Reiser
0fc4e8f795 Introduce InferContext (#14956)
## Summary

I'm currently on the fence about landing the #14760 PR because it's
unclear how we'd support tracking used and unused suppression comments
in a performant way:
* Salsa adds an "untracked" dependency to every query reading
accumulated values. This has the effect that the query re-runs on every
revision. For example, a possible future query
`unused_suppression_comments(db, file)` would re-run on every
incremental change and for every file. I don't expect the operation
itself to be expensive, but it all adds up in a project with 100k+ files
* Salsa collects the accumulated values by traversing the entire query
dependency graph. It can skip over sub-graphs if it is known that they
contain no accumulated values. This makes accumulators a great tool for
when they are rare; diagnostics are a good example. Unfortunately,
suppressions are more common, and they often appear in many different
files, making the "skip over subgraphs" optimization less effective.

Because of that, I want to wait to adopt salsa accumulators for type
check diagnostics (we could start using them for other diagnostics)
until we have very specific reasons that justify regressing incremental
check performance.

This PR does a "small" refactor that brings us closer to what I have in
#14760 but without using accumulators. To emit a diagnostic, a method
needs:

* Access to the db
* Access to the currently checked file

This PR introduces a new `InferContext` that holds on to the db, the
current file, and the reported diagnostics. It replaces the
`TypeCheckDiagnosticsBuilder`. We pass the `InferContext` instead of the
`db` to methods that *might* emit diagnostics. This simplifies some of
the `Outcome` methods, which can now be called with a context instead of
a `db` and the diagnostics builder. Having the `db` and the file on a
single type like this would also be useful when using accumulators.

This PR doesn't solve the issue that the `Outcome` types feel somewhat
complicated nor that it can be annoying when you need to report a
`Diagnostic,` but you don't have access to an `InferContext` (or the
file). However, I also believe that accumulators won't solve these
problems because:

* Even with accumulators, it's necessary to have a reference to the file
that's being checked. The struggle would be to get a reference to that
file rather than getting a reference to `InferContext`.
* Users of the `HasTy` trait (e.g., a linter) don't want to bother
getting the `File` when calling `Type::return_ty` because they aren't
interested in the created diagnostics. They just want to know what
calling the current expression would return (and if it even is a
callable). This is what the different methods of `Outcome` enable today.
I can ask for the return type without needing extra data that's only
relevant for emitting a diagnostic.

A shortcoming of this approach is that it is now a bit confusing when to
pass `db` and when an `InferContext`. An option is that we'd make the
`file` on `InferContext` optional (it won't collect any diagnostics if
`None`) and change all methods on `Type` to take `InferContext` as the
first argument instead of a `db`. I'm interested in your opinion on
this.

Accumulators are definitely harder to use incorrectly because they
remove the need to merge the diagnostics explicitly and there's no risk
that we accidentally merge the diagnostics twice, resulting in
duplicated diagnostics. I still value performance more over making our
life slightly easier.
2024-12-18 12:22:33 +00:00
Douglas Creager
e8e461da6a Prioritize attribute in from/import statement (#15041)
This tweaks the new semantics from #15026 a bit when a symbol could be
interpreted both as an attribute and a submodule of a package. For
`from...import`, we should actually prioritize the attribute, because of
how the statement itself is implemented [1].

> 1. check if the imported module has an attribute by that name
> 2. if not, attempt to import a submodule with that name and then check
the imported module again for that attribute

[1] https://docs.python.org/3/reference/simple_stmts.html#the-import-statement
2024-12-17 16:58:23 -05:00