From a28f8a46680ec5185eef12216efdaa72b90f7245 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Fri, 17 Aug 2018 12:08:46 +0300 Subject: [PATCH] PY-31424 Adjust the signature to TypeVar to accept type references One can pass string literals containing such references both to "*constraints" and "bound" parameters. --- .../python/codeInsight/typing/PyTypingTypeProvider.java | 5 +++-- .../PyTypeCheckerInspection/InitializingTypeVar.py | 5 ++++- python/testSrc/com/jetbrains/python/PyParameterInfoTest.java | 5 +++-- .../python/inspections/Py3TypeCheckerInspectionTest.java | 4 ++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java b/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java index 57df3eb18c68..9c9d4f8d4d9c 100644 --- a/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java +++ b/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java @@ -312,8 +312,9 @@ public class PyTypingTypeProvider extends PyTypeProviderBase { final PyElementGenerator generator = PyElementGenerator.getInstance(referenceExpression.getProject()); parameters.add(PyCallableParameterImpl.nonPsi("name", builtinCache.getStringType(languageLevel))); - parameters.add(PyCallableParameterImpl.positionalNonPsi("constraints", builtinCache.getTypeType())); - parameters.add(PyCallableParameterImpl.nonPsi("bound", builtinCache.getTypeType(), generator.createEllipsis())); + final PyType typeOrForwardReference = PyUnionType.union(builtinCache.getTypeType(), builtinCache.getStrType()); + parameters.add(PyCallableParameterImpl.positionalNonPsi("constraints", typeOrForwardReference)); + parameters.add(PyCallableParameterImpl.nonPsi("bound", typeOrForwardReference, generator.createEllipsis())); final PyClassType boolType = builtinCache.getBoolType(); final PyExpression falseValue = generator.createExpressionFromText(languageLevel, "False"); diff --git a/python/testData/inspections/PyTypeCheckerInspection/InitializingTypeVar.py b/python/testData/inspections/PyTypeCheckerInspection/InitializingTypeVar.py index 01fd0044e96a..e6f2ca65ea61 100644 --- a/python/testData/inspections/PyTypeCheckerInspection/InitializingTypeVar.py +++ b/python/testData/inspections/PyTypeCheckerInspection/InitializingTypeVar.py @@ -1,4 +1,7 @@ from typing import TypeVar TypeVar("T", int, str, bound=int, covariant=True, contravariant=True) -TypeVar("T", 0, 1, bound=2, covariant=3, contravariant=4) \ No newline at end of file +TypeVar("T", int, str, bound='int', covariant=True, contravariant=True) +TypeVar("T", int, 'str', bound=int, covariant=True, contravariant=True) +TypeVar("T", 'int', 'str', bound=int, covariant=True, contravariant=True) +TypeVar("T", 0, 1, bound=2, covariant=3, contravariant=4) \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyParameterInfoTest.java b/python/testSrc/com/jetbrains/python/PyParameterInfoTest.java index e3e76c9114ed..050d66e98a24 100644 --- a/python/testSrc/com/jetbrains/python/PyParameterInfoTest.java +++ b/python/testSrc/com/jetbrains/python/PyParameterInfoTest.java @@ -846,14 +846,15 @@ public class PyParameterInfoTest extends LightMarkedTestCase { ); } - // PY-28127 + // PY-28127 PY-31424 public void testInitializingTypeVar() { runWithLanguageLevel( LanguageLevel.PYTHON34, () -> { final int offset = loadTest(1).get("").getTextOffset(); - feignCtrlP(offset).check("name: str, *constraints: type, bound: type=..., covariant: bool=False, contravariant: bool=False", + feignCtrlP(offset).check("name: str, *constraints: Union[type, str], bound: Union[type, str]=..., " + + "covariant: bool=False, contravariant: bool=False", new String[]{"name: str, "}, ArrayUtil.EMPTY_STRING_ARRAY); } diff --git a/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java index 881db67ca55b..6b9d3594b143 100644 --- a/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java @@ -81,7 +81,7 @@ public class Py3TypeCheckerInspectionTest extends PyInspectionTestCase { public void testStrFormatPy3() { doTest(); } - + // PY-18762 public void testHomogeneousTuples() { doTest(); @@ -341,7 +341,7 @@ public class Py3TypeCheckerInspectionTest extends PyInspectionTestCase { runWithLanguageLevel(LanguageLevel.PYTHON37, () -> super.doMultiFileTest()); } - // PY-28127 + // PY-28127 PY-31424 public void testInitializingTypeVar() { doTest(); }