diff --git a/python/src/com/jetbrains/python/inspections/PyDeprecationInspection.java b/python/src/com/jetbrains/python/inspections/PyDeprecationInspection.java index 8bd1f825fad9..4aa7545a54b0 100644 --- a/python/src/com/jetbrains/python/inspections/PyDeprecationInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyDeprecationInspection.java @@ -24,6 +24,7 @@ import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.PyKnownDecoratorUtil.KnownDecorator; +import com.jetbrains.python.pyi.PyiUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -59,7 +60,7 @@ public class PyDeprecationInspection extends PyInspection { final PyExpression exceptClass = exceptPart.getExceptClass(); if (exceptClass != null && "ImportError".equals(exceptClass.getText())) return; } - final PsiElement resolveResult = node.getReference(getResolveContext()).resolve(); + final PsiElement resolveResult = resolve(node); final PyFromImportStatement importStatement = PsiTreeUtil.getParentOfType(node, PyFromImportStatement.class); if (importStatement != null) { final PsiElement element = importStatement.resolveImportSource(); @@ -67,7 +68,7 @@ public class PyDeprecationInspection extends PyInspection { } String deprecationMessage = null; if (resolveResult instanceof PyFunction) { - deprecationMessage = ((PyFunction) resolveResult).getDeprecationMessage(); + deprecationMessage = ((PyFunction)resolveResult).getDeprecationMessage(); } else if (resolveResult instanceof PyFile) { deprecationMessage = ((PyFile)resolveResult).getDeprecationMessage(); @@ -114,5 +115,11 @@ public class PyDeprecationInspection extends PyInspection { } } } + + @Nullable + private PyElement resolve(@NotNull PyReferenceExpression node) { + final PyElement resolve = PyUtil.as(node.getReference(getResolveContext()).resolve(), PyElement.class); + return resolve == null ? null : PyiUtil.getOriginalElementOrLeaveAsIs(resolve, PyElement.class); + } } } diff --git a/python/testData/deprecation/deprecatedElementInPyi/a.py b/python/testData/deprecation/deprecatedElementInPyi/a.py new file mode 100644 index 000000000000..2042b3d3a59e --- /dev/null +++ b/python/testData/deprecation/deprecatedElementInPyi/a.py @@ -0,0 +1,3 @@ +import module + +module.bar() \ No newline at end of file diff --git a/python/testData/deprecation/deprecatedElementInPyi/module.py b/python/testData/deprecation/deprecatedElementInPyi/module.py new file mode 100644 index 000000000000..2e1d14094992 --- /dev/null +++ b/python/testData/deprecation/deprecatedElementInPyi/module.py @@ -0,0 +1,7 @@ +import warnings +warnings.warn("the deprecated module is deprecated; use a non-deprecated module instead", + DeprecationWarning, 2) + +def bar(): + import warnings + warnings.warn("this is deprecated", DeprecationWarning, 2) diff --git a/python/testData/deprecation/deprecatedElementInPyi/module.pyi b/python/testData/deprecation/deprecatedElementInPyi/module.pyi new file mode 100644 index 000000000000..4371a5a1f6ed --- /dev/null +++ b/python/testData/deprecation/deprecatedElementInPyi/module.pyi @@ -0,0 +1,2 @@ +def bar(): + pass diff --git a/python/testSrc/com/jetbrains/python/PyDeprecationTest.java b/python/testSrc/com/jetbrains/python/PyDeprecationTest.java index 54dab5b12390..769d444c6168 100644 --- a/python/testSrc/com/jetbrains/python/PyDeprecationTest.java +++ b/python/testSrc/com/jetbrains/python/PyDeprecationTest.java @@ -97,4 +97,12 @@ public class PyDeprecationTest extends PyTestCase { myFixture.configureByFile("a.py"); myFixture.checkHighlighting(true, false, false); } + + // PY-38101 + public void testDeprecatedElementInPyi() { + myFixture.enableInspections(PyDeprecationInspection.class); + myFixture.copyDirectoryToProject("deprecation/deprecatedElementInPyi", ""); + myFixture.configureByFile("a.py"); + myFixture.checkHighlighting(true, false, false); + } }