Commit Graph

1658 Commits

Author SHA1 Message Date
Andrey Vokin
db6d06207c PY-77891 "Unused import" inspection is inconsistent in nightly
The logic for disabling the unused warning on unresolved imports was dependent on the visit order. Moving sustracting unresolved imports to the end of computation fixes the problem.


(cherry picked from commit adeb85e59c17261a5bf9f64dfb4a7836a2403f43)

IJ-CR-153189

GitOrigin-RevId: fac4173a0fac5b29be9301f9d5f04fed08cceff1
2025-01-20 15:08:33 +00:00
Mikhail Golubev
1be05f5d9e PY-78189 Flip expected and actual types in warnings about __set__ argument
(cherry picked from commit 65f8c92b852539908c71715756ec407781a9fb6b)

IJ-CR-152050

GitOrigin-RevId: 2672bc7f5d39dd2bec1a9b2c2d322dffb3d66062
2024-12-20 14:45:15 +00:00
Aleksandr.Govenko
51fe58feb5 PY-20710 Fix NPE in PyTargetExpressionImpl
Merge-request: IJ-MR-150854
Merged-by: Aleksandr Govenko <aleksandr.govenko@jetbrains.com>

(cherry picked from commit ae24337d4cf3e2f8aa3219681bb36abce17cd212)

IJ-MR-150854

GitOrigin-RevId: f42a45ee8af4e48ab83442960e1c9cbe3e15f361
2024-12-18 02:37:10 +00:00
Aleksandr.Govenko
70fe60b4c8 PY-20710 Support 'Generator' typing class
Check YieldType of yield expressions in PyTypeCheckerInspection
Check that (Async)Generator is used in (async) function
Check that in 'yield from' sync Generator is used
Convert PyMakeFunctionReturnTypeQuickFix into PsiUpdateModCommandAction
Infer Generator type for lambdas
When getting function type from annotation, do not convert Generator to AsyncGenerator
Introduce GeneratorTypeDescriptor to simplify working with generator annotations


Merge-request: IJ-MR-146521
Merged-by: Aleksandr Govenko <aleksandr.govenko@jetbrains.com>

(cherry picked from commit b3b8182168c5224f0e03f54d443171ccf6ca7b89)

IJ-MR-146521

GitOrigin-RevId: a95670d7e2787015bcf162637ea6d7bfb47a312a
2024-12-17 20:59:50 +00:00
Aleksandr.Govenko
4dd41ee9f5 PY-20611 Missing warning about functions implicitly returning None when return type is not Optional
Updated PyFunction to account for implicit 'return None' statements when inferring return statement types.

It affected return type inference of PyFunction.

Fixed a failing test related to formatted strings.

Added a quick fix to make all return statements explicit.

Updated the CFG to include PyPassStatements, enabling detection of exit points in empty functions.

Simplified PyMakeFunctionReturnTypeQuickFix to independently infer function types and handle required imports. Currently, it does not support specifying custom suggested types.



Merge-request: IJ-MR-148719
Merged-by: Aleksandr Govenko <aleksandr.govenko@jetbrains.com>

(cherry picked from commit 9f58961f9eb70e4f9dbba7359f5aafdfd392b7e2)

IJ-MR-148719

GitOrigin-RevId: 68ef5c4a1cc0fcaffd750cc0713250a106136643
2024-12-17 18:16:40 +00:00
Aleksandr.Govenko
bdbe78b63a PY-60714 PyCharm does not understand async iterators
__anext__ method is required to return Awaitable. When getting iterated type, unwrap that awaitable


Merge-request: IJ-MR-150432
Merged-by: Aleksandr Govenko <aleksandr.govenko@jetbrains.com>

(cherry picked from commit 97a070ead70c0ec0f2da08000517c592c5805965)

IJ-MR-150432

GitOrigin-RevId: 21dc20b164e6095e56707ea50bc93bf67564e88e
2024-12-17 15:42:06 +00:00
Mikhail Golubev
31678081b3 PY-77167 Simplify resolve logic for overloads, get rid of RatedResolveResult#RATE_LIFTED_PY_FILE_OVERLOAD
If there is an overload not followed by an implementation, which is
already an error, always resolve to the first overload, regardless
of whether it's a .py file, or a .pyi stub. It allows us to eliminate
the special RatedResolveResult#RATE_LIFTED_PY_FILE_OVERLOAD rate in .py
files, because we no longer need to duplicate the last, closest reachable
overload (normally an implementation should be reachable) with a higher
priority, and then filter it out during overload resolution.

Meanwhile, this filtering out didn't work right before
because some type inference logic, e.g., PyCallExpressionHelper.getCalleeType
used in PyReferenceExpressionImpl.getCallableType bypassed it. It should have
been done at the level of
PyCallExpressionHelper.forEveryScopeTakeOverloadsOtherwiseImplementations.


(cherry picked from commit 99a624ab85957d7a2d3c2c0ced596e472f9d615b)

IJ-MR-148398

GitOrigin-RevId: c2cdfe8c8b046118f4e6f7269dbf7848dd746e08
2024-12-17 15:33:39 +00:00
Mikhail Golubev
714c16f197 [python] Simplify PyResolveUtil#resolveQualifiedNameInScope
(cherry picked from commit 6b95f07ddffbbd246e5c3a852de42c0cc19098ce)

IJ-CR-151380

GitOrigin-RevId: 24a9cb2f52bdc9ace2e2d21ac0d0f2e002451dae
2024-12-17 14:53:28 +00:00
Mikhail Golubev
66f10b6356 [python] Make PyResolveUtil.resolveQualifiedNameInScope automatically traverse scopes
(cherry picked from commit 6013fdabf6967a193a60849ec0e81e153380b4b7)

IJ-CR-151380

GitOrigin-RevId: 7f238ba2bee90f15dbe9c76cbf4e089a48f52870
2024-12-17 14:53:28 +00:00
Mikhail Golubev
651f6c3310 [python] Add a clarifying comment in PyDataclassInspection
(cherry picked from commit 1f109781ad81e2b5db578a384ee5dba6b1cbbccf)

IJ-CR-151380

GitOrigin-RevId: 45a480dba35bf14df8afcd3c69707603ff5c8f19
2024-12-17 14:53:28 +00:00
Mikhail Golubev
ab6adac4d4 PY-77433 Fix resolving qualified names in field_specifiers argument of @dataclass_transform
Previously, we mistakenly tried to resolve qualified names listed in the
`field_specifiers` argument of @dataclass_transform in the same scope
where the dataclass itself is defined, not where the actual decorator
application is located.

Thus, if in the file where the dataclass is defined, a field specifier
was imported differently than where @dataclass_transform was applied, we
couldn't recognize a field specifier call in the RHS of an assignment as such
and took it for an ordinary field default value.

In particular, this is what happened with pydantic dataclasses.
`pydantic.fields.Field` is usually imported as just `pydantic.Field` where
user dataclasses are defined, but imported with an alias and set in the
`field_specifiers` argument as `PydanticModelField` in
`pydantic._internal._model_construction` where `ModelMetaclass` is defined.

It was accidentally broken in f15a07836e7aeac7c46b489b4742e8248a0e6ef4 to
support decorating class methods with dataclass_transform
(see testData/inspections/PyDataclassInspection/DataclassTransformFieldsOrder/decorator.py).
Until PyResolveUtil.resolveQualifiedNameInScope automatically traverses through
containing scopes looking for a name, the file containing decorator application
seems like a safe trade-off for the scope, because field specifiers are normally
defined or imported somewhere at the top level.


(cherry picked from commit de9afeb0831a52f058453fe678de229d41c26a4d)

IJ-CR-151380

GitOrigin-RevId: b6576ec7b72ea1e19e93b6190372a5168003c396
2024-12-17 14:53:28 +00:00
Petr
3db29fcbc8 PY-36205 False unresolved attribute reference for enum value when enum inherits str or StrEnum
(cherry picked from commit 132c996908988bccc59035c033c21325c48a6016)

GitOrigin-RevId: 8a968f2c4b2bac5c77ca60b1e22b78afc77b1eef
2024-12-17 13:31:48 +00:00
Mikhail Golubev
6e515ed9b8 PY-77433 Don't report mutable field defaults in dataclass_transform-based dataclasses
Some dataclass implementations, such as Pydantic, allow declaring fields with
mutable defaults, deep-copying them under the hood.

See https://docs.pydantic.dev/latest/concepts/models/#fields-with-non-hashable-default-values


(cherry picked from commit e495621858950976226731dddbb01af4012704fa)

IJ-CR-151192

GitOrigin-RevId: 7412272584a4c26e404d3d84e6150f974027eca7
2024-12-11 17:33:12 +00:00
Aleksandr.Govenko
d5f9bf8de0 PY-55548 Use actual return type for "Specify return type using annotation"
For async functions, unwrap return type from Awaitable or Coroutine


Merge-request: IJ-MR-146295
Merged-by: Aleksandr Govenko <aleksandr.govenko@jetbrains.com>

(cherry picked from commit 9fe8d02a9d8bb584b9d6972ce999912bd93875e6)

IJ-MR-146295

GitOrigin-RevId: 9bad4877a069268a2d0181cac70b9a0d399cb5e6
2024-12-03 16:06:45 +00:00
Irina Fediaeva
ca48a33cce PY-52574: Rephrase docstring formatter error message
(cherry picked from commit 0160800e29a630657b068f71894fef984eb8e5c9)

IJ-CR-148150

GitOrigin-RevId: da5a6e3ad423934657d8a163632564a0ab95095e
2024-11-28 01:35:55 +00:00
Irina Fediaeva
2ac1a788e3 PY-52574: Remove Epytext docstring format & Py2 docstring rendering
Docstring rendering is no longer supported for Python 2, which became obsolete after reaching its end of life in 2020. Without updates or security patches, most tools, including documentation generators like Epydoc, have shifted focus exclusively to Python 3.


(cherry picked from commit ace78ac9ad943278449d5b20bb92db9f7571b5b5)

IJ-CR-148150

GitOrigin-RevId: 75cc87e05c61c3c17c26689552080e3c3082bfdc
2024-11-28 01:35:54 +00:00
Mikhail Golubev
19a768b4d7 PY-77490 Evaluate language level only once per CFG traversal during name resolution
(cherry picked from commit 6c2a3d6eec7def72340feed8ae0ae2d6b54af6ff)

IJ-CR-149696

GitOrigin-RevId: 14edaf0fa2c49d69aa8d96883dc8b02dec7197e3
2024-11-25 22:38:29 +00:00
Mikhail Golubev
9d2070052f PY-77490 Inline private PyDefUseUtil.getLatestDefs to have access to the reference anchor element
(cherry picked from commit 0eecf0ffb305ab17d5758f20b44c4f2791ab0b02)

IJ-CR-149696

GitOrigin-RevId: 8efb9c569ea8c4c00226d3b4307ff5602f782098
2024-11-25 22:38:29 +00:00
Mikhail Golubev
b853978e3e PY-77490 Make sure PyDefUseUtil.getLatestDefs always accepts a non-null anchor
(cherry picked from commit e0ed8cedaffa90c259f4fd0cf8758e42face847b)

IJ-CR-149696

GitOrigin-RevId: 7a90e82dc6bc86fa5d5eae98951e90d13b445a15
2024-11-25 22:38:29 +00:00
Mikhail Golubev
bb5e98a07d PY-77490 Infer nullability annotations in PyDefUseUtil
(cherry picked from commit f993806b3d199160b8a18117fc6b473e52db13bb)

IJ-CR-149696

GitOrigin-RevId: 773c097981921257681a67c58fd6ba2190a3a9c2
2024-11-25 22:38:29 +00:00
Mikhail Golubev
535af53f05 PY-77168 Allow flow-sensitive resolve from unmatched version checks to reachable outer blocks
Also, don't query LanguageLevel for each element of each instruction,
only once per scope traversal.

This doesn't fix the problem with unreachable definition *inside* blocks under
unmatched version checks, i.e.

if sys.version_info < (3, 8):
    Alias = int
    expr: Alias # unresolved

but it's a more difficult problem how to handle those consistently with the idea
of unreachable version checks under the *current* interpreter version, and hopefully
it occurs rarer than, say, unresolved top-level imports of common names from typing.

(cherry picked from commit 55fd4597c6d0860d290caba15fbf4d313e985a86)

IJ-CR-149696

GitOrigin-RevId: 357ada7e10618aef75c470e6cd878f7672109e83
2024-11-25 22:38:29 +00:00
Petr
22cae80f9d PY-76076 Use proper python version for pyi files to evaluate version guards (PyDefUseUtil).
(cherry picked from commit cc6529de62f7c687c606697b9207170b7903f96d)

IJ-MR-147937

GitOrigin-RevId: 32b1f2d47fecc5592e5b93265c195ca3051497b9
2024-11-25 22:38:29 +00:00
Mikhail Golubev
3fdadc1b6b PY-40458 Use overridden method's return type for overrides only if both are async or synchronous
Because async generator methods in ABC and protocols are supposed to be declared as
plain "def" methods so as not to confuse type checkers with their AsyncIterable
return type annotations, it's better to disable such type-hint re-use if methods
async-ness don't match and not wrap anything in typing.Coroutine implicitly.

See also https://mypy.readthedocs.io/en/stable/more_types.html#asynchronous-iterators

(cherry picked from commit 6342f15a7786ec0d02ee1ab2b18fd40fd1ca1430)

IJ-CR-149694

GitOrigin-RevId: 3e19f190d9334e6c8648462ebb5b61abe931b0e6
2024-11-25 22:38:29 +00:00
Mikhail Golubev
fae8df34f4 PY-36416 Don't wrap return types of overridden async methods in Coroutine twice
(cherry picked from commit 48d01bedeb62d1a232704e58a3f39e3a7d543d2d)

IJ-CR-149694

GitOrigin-RevId: e431744a18f2b9d2976de7ee12888961e22f2298
2024-11-25 22:38:29 +00:00
Mikhail Golubev
2864833fca PY-76642 Add correct imports when generating type hints containing TypedDict
(cherry picked from commit 5c7761bea54741d68a7137788a46785db61f4247)

IJ-CR-149697

GitOrigin-RevId: 9eafefe6cef2bd599e6b84cf7d199f72c675b14f
2024-11-21 15:09:57 +00:00
Mikhail Golubev
1d8c4eebd6 PY-46546 For Python 3.9+, on "Add type hint for ..." don't import obsolete generic aliases from typing
(cherry picked from commit 7bc7d79e4ad464b67792e19f1be6262946917619)

IJ-CR-149697

GitOrigin-RevId: 5ebc4ec0cf4e5aacffd3f3cd1f62bc5617ae8cf6
2024-11-21 15:09:57 +00:00
Mikhail Golubev
99a6645e5d PY-36889 Type check assignments to class/instance attributes outside of class bodies
Previously, PyTypingTypeProvider.getReferenceType returned a type from a class attribute
type hint only for assignment to instance attribute located inside a class definition.

In other words, here we inferred the expected type from the annotation
and reported incompatible types in assignment:

```python
class C:
    attr: int

    def m(self):
        self.attr = "foo"
```
but in the following we didn't:

```python
class C:
    attr: int

inst = C()
inst.attr = "foo"
```

Now we try to resolve any qualified target expression to a class
or instance attribute and then infer the type from the corresponding
annotation.


(cherry picked from commit 086dbb678a8cd89cfe332bf801631568fb6c3a4d)

IJ-MR-147382

GitOrigin-RevId: 4e3f71baa598d4caf684d0aeab23d1a9a688b94d
2024-11-19 17:25:06 +00:00
Irina Fediaeva
5e6cc9697d EA-926314: Fix IllegalArgumentException
(cherry picked from commit 99659628ac1514c83a1ac4820ef53558b10d6526)

IJ-CR-149566

GitOrigin-RevId: 94bd1112772f6d479c299456f691825a026410bb
2024-11-18 18:59:30 +00:00
Andrey Vokin
5b0a0b90ee PY-51687 Ctrl-Click on TypedDict usage jumps to builtins.py instead of the TypedDict declaration in the use code
(cherry picked from commit 72d68f8b3099563f77eae1bfd9ef28b8f479a7cf)

IJ-CR-148264

GitOrigin-RevId: 95c8e88ac6e3aef6a8364c2a841a1a8bce2f4d3d
2024-11-12 21:16:33 +00:00
Andrei Iurko
efbebbef0b [qodana] QD-9891 Add reviewed inspections categories and fix json schema validation
GitOrigin-RevId: 7ca2b2fde31a47b41b1940badee13d931bd91102
2024-11-06 14:28:05 +00:00
Mikhail Golubev
da2936d4a4 PY-42137 Report incorrect arguments if no overload matches
Previously, we reported call arguments only if either all callee
candidates have unmatched arguments or all call candidates have
unmatched parameters. When there was a mix of the two, we reported
nothing.


(cherry picked from commit 97b42faf10de74ee7cd10f934d9eb94e1c8bbb34)

IJ-CR-146869

GitOrigin-RevId: 8babfe6a8ad0152f985655eff27df4df68936594
2024-11-06 11:22:48 +00:00
Mikhail Golubev
09fa8a0611 [python] Introduce PyArgumentsMapping.isComplete
(cherry picked from commit 64dca74e18a2ae8c4a64f6730093e59dbef6b671)

IJ-CR-146869

GitOrigin-RevId: 42cc87410c38c09a65b38d2ca9389474f17ae8b6
2024-11-06 11:22:48 +00:00
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
0cb148129f [python] dataclass_transform: use the annotated class as a resolve anchor for resolving the field specifiers
(cherry picked from commit f15a07836e7aeac7c46b489b4742e8248a0e6ef4)

GitOrigin-RevId: edf8399741cc5d62ba2fb04f9314eb620f83abae
2024-10-28 20:14:19 +00:00
Daniil Kalinin
24d6509dcd [python] loosen the restrictions on dataclass_transform qualified names
(cherry picked from commit b3e20087b64b159382bc24992efa12b5833d4018)

GitOrigin-RevId: 9f74c1d281fa68d937ad925a865feec29175fe93
2024-10-28 20:14:19 +00:00
Daniil Kalinin
7d891602cf [python] rename __get__ in PyNames.java from GET to DUNDER_GET to avoid confusion
(cherry picked from commit 23dd9bc6cb72630e3bee02a2fb160ff38be17d9a)

GitOrigin-RevId: 94e20ece2828c01019c20ae02663e9bad89a8ff7
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
a7b3aaec00 PY-76629: Do not resolve bundled stubs when the package is not installed
The implementation is very similar to the PyTypeShed,
it should be merged into more general solution.

GitOrigin-RevId: 1449a774e93206349f17f264c27e2a7877d79b19
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
Mikhail Golubev
d69f93c593 PY-76629: Fix DjangoViewNameCompletionTest.testViewNameCompletionInMethods
There were two underlying problems in Kotlin code:
```
run { DjangoFQNamesProvider.ACCEPTS_VIEW_NAME.isNameMatches(this) } != null
```
returned true regardless of the result of `isNameMatches(this)` call.
As a result, we used to suggest Django view names for *all* functions called
"reverse", "redirect" or "reverse_lazy".

Secondly, in FQNamesProviderExtKt.isNameMatches:
```
return getQualifiedNames().any {
  return it.firstComponent == elementQualifiedName.firstComponent &&
         it.lastComponent == elementQualifiedName.lastComponent
}
```
always returned the result of comparison with the first qualified name, ignoring the rest
due to non-local return from the inline `any`.

Finally, DjangoUrlViewProvider.isReverseFunction expected a PyFunctionType as the type
of reverse/redirect/reverse_lazy, but since these functions have overloads in .pyi
stubs we started to infer a union type of PyFunctionTypes for them, breaking the reference
provider. In general, it's better to perform a name resolution instead of type inference
to detect a fully qualified name for a reference.

GitOrigin-RevId: 69949b1b0e65f00557536cf16127279a83ea4f9d
2024-10-28 14:57:56 +00:00
Mikhail Golubev
20b2e20d26 PY-76629 PY-39761 Don't type check __class_getitem__ arguments inside type hints
GitOrigin-RevId: 060a2952d49777bff9853a2d5bc4d257271e559e
2024-10-28 14:57:56 +00:00
Petr
1732354c38 PY-76506 Indexing process should not rely on non-indexed file data in PyCharm 2024.2
(cherry picked from commit 690d2c0c9b044c4132d607e81e770939a3be2315)

GitOrigin-RevId: a524db73b9bd2bdf914e6302460d2a64ab339356
2024-10-28 12:17:15 +00:00
Artem Ivanov
0668846014 PY-74176 Tweak activation of magic literals so they don't interfere with renaming symbols
(cherry picked from commit 69327fbc6680be176286f8fc3dc2aa89140d6c7d)

IJ-MR-146071

GitOrigin-RevId: 37da3ea34c760c7d61384d96616d746a0b731636
2024-10-25 20:18:37 +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
Petr
08c5bfb142 PY-75537 Implement PyAstNamedParameter.getRepr()(PyFrontendElementTypesFacadeImpl.kt)
(cherry picked from commit ef38af29fd176324f4c1bec503a116a5b4f351b4)

GitOrigin-RevId: 9b47c8018c3f8ad04c365175bbeb2791feb966cc
2024-10-18 17:10:51 +00:00
Petr
411f36db5a PY-75537 Implement PyAstStringLiteralExpression.createLiteralTextEscaper() (PyFrontendElementTypesFacadeImpl.kt)
(cherry picked from commit c42b7626a6e57c118e7028a4806bd8fa7938076c)

GitOrigin-RevId: e68adbb728051d49654d76df856b522191330170
2024-10-18 17:10:51 +00:00
Petr
78c67850e3 PY-75537 Implement PyAstStringLiteralExpression.getStringValue(), PyAstStringLiteralExpression.getStringValueTextRange() (PyFrontendElementTypesFacadeImpl.kt)
(cherry picked from commit 372f147a61e07c6cb21aaeb8a7d0f3d14d49417d)

GitOrigin-RevId: 9682c8df1f0acd21580e87d8381995960abeeb8a
2024-10-18 17:10:51 +00:00
Petr
001266a5b7 PY-75537 Implement PyAstAssignmentStatement.getTargetsToValuesMapping() (PyFrontendElementTypesFacadeImpl.kt)
(cherry picked from commit 8c4926689e42f117275986c2e1246d7e04bde489)

GitOrigin-RevId: f83b02700ce17a182807ac8bfe1a0108e09d4741
2024-10-18 17:10:51 +00:00