From e3735015e4bd808f2b755b439e94280dd7e1e188 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Tue, 8 May 2018 19:11:28 +0300 Subject: [PATCH] Fix return type for dataclass callable type (PY-28442) --- .../codeInsight/stdlib/PyDataclassTypeProvider.kt | 2 +- .../PyTypeCheckerInspection/DataclassClsCallType/a.py | 11 +++++++++++ .../DataclassClsCallType/dataclasses.py | 3 +++ .../inspections/Py3TypeCheckerInspectionTest.java | 5 +++++ 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 python/testData/inspections/PyTypeCheckerInspection/DataclassClsCallType/a.py create mode 100644 python/testData/inspections/PyTypeCheckerInspection/DataclassClsCallType/dataclasses.py diff --git a/python/src/com/jetbrains/python/codeInsight/stdlib/PyDataclassTypeProvider.kt b/python/src/com/jetbrains/python/codeInsight/stdlib/PyDataclassTypeProvider.kt index 51e73040d670..05781d3be64b 100644 --- a/python/src/com/jetbrains/python/codeInsight/stdlib/PyDataclassTypeProvider.kt +++ b/python/src/com/jetbrains/python/codeInsight/stdlib/PyDataclassTypeProvider.kt @@ -108,7 +108,7 @@ class PyDataclassTypeProvider : PyTypeProviderBase() { .mapNotNull { fieldToParameter(cls, it, dataclassParameters.type, ellipsis, context) } .toList() - return PyCallableTypeImpl(parameters, context.getType(cls)) + return PyCallableTypeImpl(parameters, context.getType(cls)?.let { if (it is PyInstantiableType<*>) it.toInstance() else it }) } private fun fieldToParameter(cls: PyClass, diff --git a/python/testData/inspections/PyTypeCheckerInspection/DataclassClsCallType/a.py b/python/testData/inspections/PyTypeCheckerInspection/DataclassClsCallType/a.py new file mode 100644 index 000000000000..b1e7f8012bd7 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/DataclassClsCallType/a.py @@ -0,0 +1,11 @@ +from dataclasses import dataclass + + +@dataclass +class Point: + x: int + y: int + + @classmethod + def from_str(cls, string: str) -> 'Point': + return cls(1, 2) \ No newline at end of file diff --git a/python/testData/inspections/PyTypeCheckerInspection/DataclassClsCallType/dataclasses.py b/python/testData/inspections/PyTypeCheckerInspection/DataclassClsCallType/dataclasses.py new file mode 100644 index 000000000000..68675bfddc1b --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/DataclassClsCallType/dataclasses.py @@ -0,0 +1,3 @@ +def dataclass(_cls=None, *, init=True, repr=True, eq=True, order=False, + unsafe_hash=False, frozen=False): + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java index fcd49d94b122..881db67ca55b 100644 --- a/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java @@ -297,6 +297,11 @@ public class Py3TypeCheckerInspectionTest extends PyInspectionTestCase { runWithLanguageLevel(LanguageLevel.PYTHON37, () -> super.doMultiFileTest()); } + // PY-28442 + public void testDataclassClsCallType() { + runWithLanguageLevel(LanguageLevel.PYTHON37, () -> super.doMultiFileTest()); + } + // PY-26354 public void testInitializingAttrs() { doTestByText("import attr\n" +