From 336dc0b210d8805143e0856d6f454515e9c93319 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Fri, 21 Apr 2017 17:12:39 +0300 Subject: [PATCH] PY-22302 PY-23355 Don't warn about ellipsis and star expressions in function type comments Also, UnsupportedFeatures annotator properly detects the language level for the analyzed element. Previously, it used Python version of the containing file for some injected fragments. --- .../PyFunctionTypeAnnotationVisitorFilter.java | 3 ++- .../python/validation/UnsupportedFeatures.java | 9 +++++---- .../noWarningAboutEllipsisInFunctionTypeComments.py | 12 ++++++++++++ ...gAboutStarredExpressionsInFunctionTypeComments.py | 3 +++ .../inspections/PyCompatibilityInspectionTest.java | 10 ++++++++++ 5 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 python/testData/inspections/PyCompatibilityInspection/noWarningAboutEllipsisInFunctionTypeComments.py create mode 100644 python/testData/inspections/PyCompatibilityInspection/noWarningAboutStarredExpressionsInFunctionTypeComments.py diff --git a/python/src/com/jetbrains/python/codeInsight/functionTypeComments/PyFunctionTypeAnnotationVisitorFilter.java b/python/src/com/jetbrains/python/codeInsight/functionTypeComments/PyFunctionTypeAnnotationVisitorFilter.java index 9a80da979cb3..8e3a0b9322b4 100644 --- a/python/src/com/jetbrains/python/codeInsight/functionTypeComments/PyFunctionTypeAnnotationVisitorFilter.java +++ b/python/src/com/jetbrains/python/codeInsight/functionTypeComments/PyFunctionTypeAnnotationVisitorFilter.java @@ -32,6 +32,7 @@ public class PyFunctionTypeAnnotationVisitorFilter implements PythonVisitorFilte visitorClass == PyMandatoryEncodingInspection.class || visitorClass == PyNonAsciiCharInspection.class || visitorClass == PyInterpreterInspection.class || - visitorClass == PyPep8Inspection.class); + visitorClass == PyPep8Inspection.class || + visitorClass == PyCompatibilityInspection.class); } } diff --git a/python/src/com/jetbrains/python/validation/UnsupportedFeatures.java b/python/src/com/jetbrains/python/validation/UnsupportedFeatures.java index effe3928ca99..1f315ba9bed1 100644 --- a/python/src/com/jetbrains/python/validation/UnsupportedFeatures.java +++ b/python/src/com/jetbrains/python/validation/UnsupportedFeatures.java @@ -22,15 +22,15 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ex.ProblemDescriptorImpl; import com.intellij.codeInspection.ex.QuickFixWrapper; +import com.intellij.lang.annotation.AnnotationHolder; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.jetbrains.python.psi.LanguageLevel; -import com.jetbrains.python.psi.PyElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; /** * @author Alexey.Ivanov @@ -42,8 +42,9 @@ public class UnsupportedFeatures extends CompatibilityVisitor { } @Override - public void visitPyElement(PyElement node) { - setVersionsToProcess(Arrays.asList(LanguageLevel.forElement(node))); + public synchronized void annotateElement(PsiElement psiElement, AnnotationHolder holder) { + setVersionsToProcess(Collections.singletonList(LanguageLevel.forElement(psiElement))); + super.annotateElement(psiElement, holder); } @Override diff --git a/python/testData/inspections/PyCompatibilityInspection/noWarningAboutEllipsisInFunctionTypeComments.py b/python/testData/inspections/PyCompatibilityInspection/noWarningAboutEllipsisInFunctionTypeComments.py new file mode 100644 index 000000000000..efdd12528893 --- /dev/null +++ b/python/testData/inspections/PyCompatibilityInspection/noWarningAboutEllipsisInFunctionTypeComments.py @@ -0,0 +1,12 @@ +from typing import List + +class Example: + def method(self, + lst, # type: List[str] + opt=0, # type: int + *args, # type: str + **kwargs # type: bool + ): + # type: (...) -> int + """Docstring comes after type comment.""" + pass diff --git a/python/testData/inspections/PyCompatibilityInspection/noWarningAboutStarredExpressionsInFunctionTypeComments.py b/python/testData/inspections/PyCompatibilityInspection/noWarningAboutStarredExpressionsInFunctionTypeComments.py new file mode 100644 index 000000000000..83f55e63269f --- /dev/null +++ b/python/testData/inspections/PyCompatibilityInspection/noWarningAboutStarredExpressionsInFunctionTypeComments.py @@ -0,0 +1,3 @@ +def create_instance(self, task_config, **kwargs): + # type: (TaskConfig, **Text) -> TaskInstance + pass diff --git a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java index 7afe19f1f695..50e7d9825960 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java @@ -219,6 +219,16 @@ public class PyCompatibilityInspectionTest extends PyTestCase { doTest(LanguageLevel.PYTHON36); } + // PY-22302 + public void testNoWarningAboutEllipsisInFunctionTypeComments() { + doTest(); + } + + // PY-23355 + public void testNoWarningAboutStarredExpressionsInFunctionTypeComments() { + doTest(); + } + private void doTest(@NotNull LanguageLevel level) { runWithLanguageLevel(level, this::doTest); }