Commit Graph

6594 Commits

Author SHA1 Message Date
Daniil Kalinin
ea62ea04bc IJ-MR-146029 PY-76149 simplify the check for expected type from __set__ and assigned value
Reword the inspection text
Co-authored-by: Mikhail Golubev <mikhail.golubev@jetbrains.com>

(cherry picked from commit cab3cb1bbb1316462ee3fd37e735765b31b8d5e8)

GitOrigin-RevId: e3288e503d714a1f76bd1a2e6a0553770e1cbad5
2024-10-28 20:14:19 +00:00
Daniil Kalinin
0f40a088df IJ-MR-146029 PY-76149 code review changes and improvements
* Remove unnecessary descriptor type inference from `PyTargetExpressionImpl.getType`
* Refactor overload resolution for synthetic calls, minor refactorings in PyDescriptorTypeUtil
* Add additional test for __set__
* Do not substitute missing argument types with implicit `Any` in PySyntheticCallHelper
* Always take the first overload for `__set__` if more than one is present

(cherry picked from commit 9d1f9d37f3ea23ce6145f82fc8f62212f744e858)

GitOrigin-RevId: 372dc0e8ccc32095aecf3f611645adc06c2873e9
2024-10-28 20:14:19 +00:00
Daniil Kalinin
c653a43cab PY-76149 Support descriptor types as annotations for dataclass fields
(cherry picked from commit 78a127e1a0083ece810ad996124ad6ea65887da2)

GitOrigin-RevId: 0c33fe51f5f13116f773577056317c537cbc83ef
2024-10-28 20:14:19 +00:00
Daniil Kalinin
4ad6f08f45 PY-76399 Support __set__ descriptor
Add API for inferring the expected type of `__set__` from `value` parameter
Add corresponding logic to PyTypeCheckerInspection to check if assigned value matches the expected descriptor type
Add tests on it

(cherry picked from commit b14ab7b2e40e225b508875a778ceae8986cbb291)

GitOrigin-RevId: 2b15b2b4527a95e5912897ba256dcc73d71c3dcd
2024-10-28 20:14:19 +00:00
Ilia Zakoulov
ab53444089 PY-76629: Get rid of Django skeleton tests
GitOrigin-RevId: e96b82a3bcba484a5321c54cd15ff755dd7e276d
2024-10-28 14:57:57 +00:00
Ilia Zakoulov
91f27d8587 PY-76629: Suppress PyProtectedMemberInspection if a member is defined in .pyi
Protected member should not be highlighted as a warning if it resolves to .pyi file.
We assume that everything in .pyi file is a public API.

GitOrigin-RevId: c8275f3e48e3cd69b1676de9b78606f28ea224c8
2024-10-28 14:57:57 +00:00
Daniil Kalinin
814b2947d3 PY-76680 Fix IOOBE: SmartList.checkOutOfBounds in PySyntheticCallHelper.java
(cherry picked from commit 737513a3a2b0c9564055ff17845cebb80af10cd2)

IJ-CR-147142

GitOrigin-RevId: 93bfc9464bcbc97ec80cb6ad4ed10c484f2ee9ec
2024-10-23 16:12:41 +00:00
Tagir Valeev
ac6e041167 Remove groovy-stdlib dependency where unused
GitOrigin-RevId: ecbe272c09c97517177b2214479f2644c1ef3229
2024-10-08 09:28:42 +00:00
Alexey Kudravtsev
fa88174b0a allow python quick fix tests to change document during highlighting
GitOrigin-RevId: f69e2b152a473941411e1574c79235c50e5e8922
2024-10-04 12:14:40 +00:00
Vladimir Krivosheev
2af05dec25 extract intellij.platform.ide.internal
GitOrigin-RevId: 0e5e80fd53c3ef15ed9835a9400381d383526ca3
2024-10-03 19:22:03 +00:00
Daniil Kalinin
783bbde096 PY-75760 - allow reference to another ParamSpec be default of ParamSpec type, simplify logic of generic substitution for TypeVars
GitOrigin-RevId: 9ca5d7f3529513c683424d2f4d6da75f40d58e4a
2024-10-03 12:19:06 +00:00
Daniil Kalinin
d29d55476e PY-75760 - adjust testTypeVarParameterizedConstraints test
Sacrifice this old test for a good cause. The inferred type of `my_list_t1` is now `List[null]` which matches with pyright - it also has no complaints in the changed fragment

GitOrigin-RevId: 2176ffa69c6a24ec55344f4294e04542185ca7e7
2024-10-03 12:19:06 +00:00
Daniil Kalinin
411f2af7ba PY-75760 Refactor the implementation of PEP 696 support - Tests
Change the expected type of `testNewStyleTypeAliasOneWithoutDefault` test (now it is the same as in pyright)
Add the same tests but using old-style type aliases

Add a couple more tests on aliased types for some tricky cases

GitOrigin-RevId: 9d289d8e0964c592f4282f9970eeb9a08a8105e5
2024-10-03 12:19:06 +00:00
Vladimir Krivosheev
26c94d85b0 extract intellij.platform.ide.remote
GitOrigin-RevId: 9d68fda3031f89d5b0207782e796a54f24683176
2024-10-03 09:58:11 +00:00
Mikhail Golubev
190a55438e [python] Special-case typing.Generic while calculating a class MRO
typing.Generic is a magical class that can be specified in any position
in the list of base classes, not affecting the MRO consistency. It's done by
the custom __mro_entries__ implementation in typing._BaseGenericAlias (Python < 3.12),
which skips this Generic entry if there are other generic classes following
it on the list of superclasses. Namely, it's possible to do the following:

```
class Base(Generic[T]):
    pass

class MyClass(Generic[T], Base[T]):
    pass
```

which would cause a TypeError for regular classes. Since it broke our implementation
of the C3 algorithm in PyClassImpl.getMROAncestorTypes, we now special-case it by
always moving typing.Generic to the very end of the base class list while constructing
MRO.

See https://github.com/python/cpython/blob/3.11/Lib/typing.py#L1298 for a pure-Python
version of typing._BaseGenericAlias.__mro_entries__ and a relevant discussion in
https://github.com/python/cpython/issues/106102.

GitOrigin-RevId: e7d765193d532ab8457133e8fb5ad06840d89225
2024-10-02 14:29:04 +00:00
Mikhail Golubev
5622587ae3 PY-76243 Add an extra test for an explicitly parameterized conditionally defined type alias
GitOrigin-RevId: c15c9d4d8edd36f5acc8ada8935c79e787b4bc3e
2024-10-02 14:29:04 +00:00
Daniil Kalinin
b934cfe38a PY-74231 Fix false positive "Statement expected, found Py:DEDENT" for a nested type alias
GitOrigin-RevId: 03d64abe2c949a5912eb5c16ef48a5149568d66f
2024-10-01 11:43:14 +00:00
Mikhail Golubev
e2d7d259e9 PY-76243 Don't build implicit union types for conditional definitions and names imported from stub packages
Also fixes PY-59014, PY-39761.

PyResolveImportUtil returns both .pyi stubs and the corresponding .py files for stub packages
to support partial stub packages. See the line:

```
groupedResults.topResultIs(Priority.STUB_PACKAGE) -> firstResultWithFallback(groupedResults, Priority.STUB_PACKAGE)
```

in PyResolveImportUtil.filterTopPriorityResults.

It means that, for instance, resolving the QuerySet name in type hints led to QuerySet
definitions from both places. Then, PyTypingTypeProvider.getType() for the reference expression
"QuerySet" returned a union type containing PyClassTypes for both of them, we couldn't parameterize
it in PyTypingTypeProvider.getParameterizedType and returned Any.

It's wrong that while evaluating type hints, we interpret multiple declarations as
a union type. Those should only be explicitly expressed with typing.Union or "|" operator.
This behavior was originally added in PY-18427 as an ad-hoc way to support version checks
for type hints, but now it seems detrimental because it's unclear how to parameterize
such implicit unions of generic types then.

Other type checkers also don't treat conditional definitions like that. For instance, for
conditional type aliases, Mypy complains about the name being defined twice and then uses
only the first definition, and Pyright doesn't consider names under conditions other than
version checks as valid type aliases at all. Both type checkers also support partial stub
packages properly.

GitOrigin-RevId: 1ecc7ab5d09625d10850ddc0e1f7761332ccddd5
2024-09-30 13:32:14 +00:00
Andrey Lisin
86a44e2b79 PY-72239 Cleanup: replace deprecated ImmutableSet.of with Collections.singleton
GitOrigin-RevId: 4d223701e964f19107d23ebcfeec8b86ab83210b
2024-09-30 11:02:49 +00:00
Andrey Lisin
aae7c6e856 PY-72239 Fix Python data viewer env-tests
GitOrigin-RevId: 19d66d158a367e98b1eead93955fcdea11f35e0d
2024-09-30 11:02:49 +00:00
Andrey Lisin
4843e1d6e4 PY-73432 Introduce checkbox option for enabling debugger server mode
GitOrigin-RevId: 7a9bc66ab59b2a209c15d3313256f2ebf61e2193
2024-09-26 13:47:19 +00:00
Egor Eliseev
ed136fcdd4 [python] Fix Python Console tests
Delete IPythonConsoleTest#testParsing: duplicates PythonConsoleParsingTest#testQuestionEnd. Fails because a virtual file is not marked as IPython.
PythonConsoleTest#testCompletionDoNotEvaluateProperty: rewrite to static.
DebugConsoleTest: delete deprecated python function.


Merge-request: IJ-MR-145576
Merged-by: Egor Eliseev <Egor.Eliseev@jetbrains.com>

GitOrigin-RevId: 3708defece0a957708073b524995c21e7d095224
2024-09-26 13:05:09 +00:00
Andrey Lisin
27c038505c IJ-CR-143143 Extract default port number right from registry
GitOrigin-RevId: 57024f04473d7685fc7644d33f2bd12551ae1364
2024-09-25 09:10:59 +00:00
Mikhail Golubev
cb838b6577 PY-60968 Add a more precise test emulating the scenario with Typeshed before its update
GitOrigin-RevId: d0422405cd2a37ee3ed8bed144b6e4c1e3267fe5
2024-09-24 12:19:35 +00:00
Mikhail Golubev
ffceeb161b PY-76076 Acknowledge sys.version_info guards in flow-sensitive same-scope resolve
sys.version_info guards are processed at the level of ScopeImpl.collectDeclarations and
PyResolveUtil.scopeCrawlUp in PyReferenceImpl.resolveInner, as implemented in
3318ff79cdcc5ba0ce5e4feb65abad5ad0f4acfa.
However, once we collected all name definition candidates flow-insensitively this way, in
PyReferenceImpl.getResultsFromProcessor, if the reference and these candidates were located
in the same scope, we completely ignored these variants and gathered reachable definitions all
over again from CFG using PyDefUseUtil.getLatestDefs. And the latter didn't consider version
guards at all. I've added version guard checks directly in PyDefUseUtil.getLatestDefs.

GitOrigin-RevId: 9f92eecd1eb1812bfbd2bf54f8192f45f0cf0a1d
2024-09-24 12:19:35 +00:00
Mikhail Golubev
de0f128ac5 PY-60968 Add a regression test, the problem itself was fixed by supporting sys.version_info checks (PY-34617)
Namely, acknowledging them for import statements in df52f60574962e1bc222121aadc082683de0a869.

Additionally, the problematic conditional import of dict in csv.pyi as

```
if sys.version_info >= (3, 8):
    from builtins import dict as _DictReadMapping
else:
    from collections import OrderedDict as _DictReadMapping
```

was removed with the recent Typeshed update in 94973415b96b2a0f859d29b0201d1ccee0d06462 (PY-73263).

GitOrigin-RevId: 1100fd0dd01be9200149a1216b207bffa7ab13d6
2024-09-24 12:19:35 +00:00
Ilya.Kazakevich
3689a45984 Python NPW and Add SDK refactoring:
In SDK:
* `v1`: legacy API that should be dropped (but still used by Python Plugin and DS)
* `v2`: slightly better API used both for new project and interpreter settings. Supports DSL UI validation. Must be adopted by DS and Python Plugin somehow.

In NPW:
* `newProject`, `newProject/steps` (aka `v1`) deprecated, used only by DS and Python Plugin.
* `newProjectWizard` (aka PyV3): the right new API to use. Sooner or later will be adopted by DS and Python Plugin

GitOrigin-RevId: c3d49ce95079dc5ba589955381ddfe42326295fd
2024-09-23 21:14:22 +00:00
Aleksandr Sorotskii
d67337d2c9 fix additional data creation for remote interpreters; (#PY-76055) Fixed
GitOrigin-RevId: 064cbbaeb5f4241b718c9e51df0396b49971a365
2024-09-23 16:37:06 +00:00
Ilya.Kazakevich
08b404640a Python tests: allowRootAccess to the python SDK.
GitOrigin-RevId: 2c5469b7b35d7a1276ab648b373db15284cb6623
2024-09-23 15:41:26 +00:00
Ilya.Kazakevich
2c510f644c Revert "Python: Allow access python roots in tests."
`Application` isn't always available at that time. It is better to register allowed roots directly in the tests.

This reverts commit 8f8bf13f859e9cf69ab424b8692968a18aa537cc.

GitOrigin-RevId: c5cf6ba7fb77a7bc350b090a450519ecff1472ad
2024-09-23 15:41:26 +00:00
Ilya.Kazakevich
0def6fd000 Python: Allow access python roots in tests.
On TC you are only allowed to access certain directories (temp dir, project roots and so on).

Some services might also access Python interpreter folders (to index python libs for example), hence we allow this too to prevent exceptions

GitOrigin-RevId: 8f8bf13f859e9cf69ab424b8692968a18aa537cc
2024-09-19 20:44:15 +00:00
Tagir Valeev
d013c9980e Remove redundant keySet/values calls
GitOrigin-RevId: e972012a4ead404120b0f947c79d059f6d96f942
2024-09-18 20:27:35 +00:00
Andrey Lisin
88e7feabc8 PY-73432 Add sleep call in test script to mitigate potential GIL blocking by single thread
GitOrigin-RevId: 10f93a092d6004cbba284e2152ce9064991f7d1b
2024-09-17 16:06:33 +00:00
Andrey Lisin
663b5dad42 PY-73432 Use Targets API in Python debugger test task; use debugger server mode in tests by default
GitOrigin-RevId: 050a261e6d8ded837ba6b33ec8da0d182468eedf
2024-09-16 18:27:23 +00:00
Vladimir Koshelev
77f726391c [pycharm] fix NPE if the generic type of narrowed type is unresolved or any PY-75961
GitOrigin-RevId: 1d186023446c81a9cd56269f25354d26e6c00d3a
2024-09-16 17:32:59 +00:00
Tagir Valeev
0262382d71 ModuleBuilder.getModuleType inheritors: raw type removed
GitOrigin-RevId: 454b9c1543c29e27cdb1c1656d9be82afd4d769e
2024-09-16 11:23:15 +00:00
Daniil Kalinin
0577faa530 PY-71002, PY-75875 refactor PEP-696 support, fix the issue when generic classes were wrongly parameterized when Any was used as an explicit type
The refactoring also fixes the problem with wrong types inferred for contextlib.contextmanager

GitOrigin-RevId: 1601047786a0c43a463a82225b18635d407bcb40
2024-09-13 08:45:13 +00:00
Aleksandr Sorotskii
c900467d05 PY-75682 prefer project local .venv directory instead of global one
GitOrigin-RevId: a5156a410b9ef959287af15f94eb7e95739afec5
2024-09-12 13:36:37 +00:00
Ilya.Kazakevich
6a9aebe3e6 Python: introduce failure as a sugar over Result.failure(Throwable(userVisibleText))
GitOrigin-RevId: cefb5234d830f4e306e385161dd07d35eb12989b
2024-09-11 23:49:58 +00:00
Mikhail Golubev
740771109f PY-54560 Fix handling of class-based field specifiers, add extra tests
GitOrigin-RevId: e411c00a4aeb12da59787c0273e678cab70b3e07
2024-09-09 23:17:25 +00:00
Andrey Vokin
e44c48a1b0 PY-73263 Python 3.13 Support - Code Insight - Typeshed
Temporary comment broken test

GitOrigin-RevId: 2563f368009933c2c51cb54bd865a22b5dcecf0d
2024-09-09 13:54:00 +00:00
Andrey Vokin
1041f5e6a0 PY-73263 Python 3.13 Support - Code Insight - Typeshed
GitOrigin-RevId: 94973415b96b2a0f859d29b0201d1ccee0d06462
2024-09-09 13:54:00 +00:00
Andrey Vokin
9293cc2ad7 PY-73263 Python 3.13 Support - Code Insight - Typeshed
update dataclass typeshed

GitOrigin-RevId: bda7fda7ef235351f9ec6b21aa9021d6dcbd8b80
2024-09-09 13:54:00 +00:00
Mikhail Golubev
aef3b8de3c PY-59198 PY-54560 Support "alias" parameter of attr and dataclass_transform fields
GitOrigin-RevId: 6a81d2a45d808391413b5c0b52c79f7f6c51dcbb
2024-09-09 11:34:15 +00:00
Mikhail Golubev
1da22d34fd PY-54560 Support PEP-681 dataclass_transform
`dataclass_transform` support posed a number of challenges to the current
AST/PSI stubs separation in our architecture. For the standard "dataclasses"
module and the "attrs" package API, we could rely on well-known names
and defaults to recognize and preserve the information about decorator
arguments and field specifier arguments in PSI stubs. With `dataclass_transform`
however, effectively any decorator call or extending any base class can indicate
using a "magical" API that should generate dataclass-like entities.
At the moment of building PSI stubs we can't be sure, because we can't leave
the boundaries of the current file to resolve these names and determine if these
decorators and base classes are decorated themselves with `dataclass_transform`.

To support that, we instead rely on well-known keyword argument names documented
in the spec, e.g. "kw_only" or "frozen". In other words, whenever we encounter
any decorator call or a superclass list with such keyword arguments, we generate
a `PyDataclassStub` stub for the corresponding class.

The same thing is happening with class attribute initializers, i.e. whenever
we see a function call with argument such as "default" or "kw_only" in their
RHS, we generate a `PyDataclassFieldStub` for the corresponding target expression.
Both of these stub interfaces now can contain null values for the corresponding
properties if they were not specified directly in the class definition.

Finally, for the `dataclass_transform` decorator itself, a new custom decorator stub
was introduced -- `PyDataclassTransformDecoratorStub`, it preserves its keyword
arguments, such as "keyword_only_default" or "frozen_default" controlling
the default properties of generated dataclasses.

Later, when we need concluded information about specific dataclass properties,
e.g. in `PyDataclassTypeProvider` to generate a constructor signature, or in
`PyDataclassInspection`, we try to "resolve" this incomplete information from stubs
into finalized `PyDataclassParameters` and `PyDataclassFieldParameters` that
contain non-null versions of the same fields. The main entry points for that
are `resolveDataclassParameters` and `resolveDataclassFieldParameters`.
These methods additionally handle the situations where decorators, superclass
lists and field specifiers lack any keyword arguments, and thus, there were no
automatically created custom stubs for them.

All the existing usages of `PyDataclassStub` and `PyDataclassFieldStub`
were updated to operate on `PyDataclassParameters` and `PyDataclassFieldParameters`
instead.

Counterparts of the tests on various inspection checks for the standard dataclasses
definitions were added for dataclasses created with `dataclass_transform`, even
though the spec is unclear on some aspects the expected type checker semantics, e.g.
if combining "eq=False" and "order=True" or specifying both "default" and
"default_factory" for a field should be reported.
I tried to follow common sense when enabling existing checks for such arbitrary
user-defined dataclass APIs.

GitOrigin-RevId: 4180a1e32b5e4025fc4e3ed49bb8d67af0d60e66
2024-09-09 11:34:15 +00:00
Mikhail Golubev
a20dc6e783 PY-54560 Rename some DataclassInspection tests specific to attrs
GitOrigin-RevId: 14a65a75454507867df5212dd25425178975860d
2024-09-09 11:34:15 +00:00
Daniil Kalinin
82fca2f070 PY-71002 PEP-696: Add an inspection that checks that non-default Type Parameters in declarations cannot follow the default ones
GitOrigin-RevId: 29c63024a67802457e031821e33925287f21a2ab
2024-09-07 11:11:13 +00:00
Daniil Kalinin
6279c7a3c0 PY-71002 PEP-696: Add a set of tests that covers PEP's functionality
GitOrigin-RevId: 5d14970b62451233e8852df77a6938a18b3a17b9
2024-09-07 11:11:13 +00:00
Daniil Kalinin
7751fceaed PY-71002 PEP-696: Support new syntax for default types of Type Parameters in new-style declarations
- PEP-696 adds a new syntax for declaring the default types of Type Parameters in new-new style generic classes, functions and type alias statements. Support these grammar changes.
- Store info about default types in stubs for Type Parameters
- Increment the stub version counter in PyFileElementType

GitOrigin-RevId: b6b22e3eaa86ce06132885781e5775a89bf4b840
2024-09-07 11:11:12 +00:00
Petr
4221e99ae6 PY-72951 Integrate PyCharm with the conformance test suite
GitOrigin-RevId: 1b45a7a94248b06e6610f42af01bb84be9a40bb3
2024-09-05 12:55:28 +00:00