diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInDocstringIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInDocstringIntention.java index 3c7b02f96fb3..0914d2ec7f27 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInDocstringIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInDocstringIntention.java @@ -6,6 +6,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.PsiReference; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; @@ -100,10 +101,15 @@ public class SpecifyTypeInDocstringIntention implements IntentionAction { if (type == null || type instanceof PyReturnTypeReference) { final PyCallExpression callExpression = PsiTreeUtil.getParentOfType(assignedValue, PyCallExpression.class, false); if (callExpression != null) { - final PyFunction function = (PyFunction)callExpression.resolveCalleeFunction(PyResolveContext.defaultContext()); - if (function != null) { - myText = PyBundle.message("INTN.specify.return.type"); - return true; + final PyExpression callee = callExpression.getCallee(); + if (callee != null) { + final PsiReference reference = callee.getReference(); + final PyFunction pyFunction = (PyFunction)callExpression.resolveCalleeFunction(PyResolveContext.defaultContext()); + if (reference instanceof PsiPolyVariantReference && pyFunction != null && + ((PsiPolyVariantReference)reference).multiResolve(false).length == 1) { + myText = PyBundle.message("INTN.specify.return.type"); + return true; + } } } } @@ -140,9 +146,14 @@ public class SpecifyTypeInDocstringIntention implements IntentionAction { PyType pyType = assignedValue.getType(TypeEvalContext.slow()); if (pyType == null || pyType instanceof PyReturnTypeReference) { pyFunction = (PyFunction)callExpression.resolveCalleeFunction(PyResolveContext.defaultContext()); - if (pyFunction != null) { - problemElement = null; - kind = "rtype"; + final PyExpression callee = callExpression.getCallee(); + if (callee != null) { + final PsiReference reference = callee.getReference(); + if (reference instanceof PsiPolyVariantReference && pyFunction != null && + ((PsiPolyVariantReference)reference).multiResolve(false).length == 1) { + problemElement = null; + kind = "rtype"; + } } } } diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInPy3AnnotationsIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInPy3AnnotationsIntention.java index 03fe056d9f7a..5a6ee9beb96e 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInPy3AnnotationsIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInPy3AnnotationsIntention.java @@ -11,6 +11,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.PsiReference; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; @@ -110,14 +111,22 @@ public class SpecifyTypeInPy3AnnotationsIntention implements IntentionAction { private boolean checkAvailableForReturn(PsiElement elementAt) { PyCallExpression callExpression = PsiTreeUtil.getParentOfType(elementAt, PyCallExpression.class); if (callExpression != null && callExpression.resolveCalleeFunction(PyResolveContext.defaultContext()) != null) { - PyAssignmentStatement assignmentStatement = PsiTreeUtil.getParentOfType(elementAt, PyAssignmentStatement.class); - if (assignmentStatement != null) { - final PyExpression assignedValue = assignmentStatement.getAssignedValue(); - if (assignedValue != null) { - PyType type = assignedValue.getType(TypeEvalContext.slow()); - if (type == null || type instanceof PyReturnTypeReference) { - myText = PyBundle.message("INTN.specify.returt.type.in.annotation"); - return true; + final PyExpression callee = callExpression.getCallee(); + if (callee != null) { + final PsiReference reference = callee.getReference(); + final PyFunction pyFunction = (PyFunction)callExpression.resolveCalleeFunction(PyResolveContext.defaultContext()); + if (reference instanceof PsiPolyVariantReference && pyFunction != null && + ((PsiPolyVariantReference)reference).multiResolve(false).length == 1) { + PyAssignmentStatement assignmentStatement = PsiTreeUtil.getParentOfType(elementAt, PyAssignmentStatement.class); + if (assignmentStatement != null) { + final PyExpression assignedValue = assignmentStatement.getAssignedValue(); + if (assignedValue != null) { + PyType type = assignedValue.getType(TypeEvalContext.slow()); + if (type == null || type instanceof PyReturnTypeReference) { + myText = PyBundle.message("INTN.specify.returt.type.in.annotation"); + return true; + } + } } } } diff --git a/python/testData/intentions/afterTypeInDocstring6.py b/python/testData/intentions/afterTypeInDocstring6.py new file mode 100644 index 000000000000..cd1ac903b8d2 --- /dev/null +++ b/python/testData/intentions/afterTypeInDocstring6.py @@ -0,0 +1,10 @@ +class A: + def unresolved(self): + pass + +class B: + def unresolved(self): + pass + +def foo3(param): + i = param.unresolved() \ No newline at end of file diff --git a/python/testData/intentions/beforeTypeInDocstring6.py b/python/testData/intentions/beforeTypeInDocstring6.py new file mode 100644 index 000000000000..cd1ac903b8d2 --- /dev/null +++ b/python/testData/intentions/beforeTypeInDocstring6.py @@ -0,0 +1,10 @@ +class A: + def unresolved(self): + pass + +class B: + def unresolved(self): + pass + +def foo3(param): + i = param.unresolved() \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyIntentionTest.java b/python/testSrc/com/jetbrains/python/PyIntentionTest.java index d31c2b22b271..b3d0a1e82275 100644 --- a/python/testSrc/com/jetbrains/python/PyIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/PyIntentionTest.java @@ -249,6 +249,11 @@ public class PyIntentionTest extends PyTestCase { doDocReferenceTest(); } + + public void testTypeInDocstring6() { + doNegativeTest(PyBundle.message("INTN.specify.return.type")); + } + private void doDocReferenceTest() { doTest(PyBundle.message("INTN.specify.type")); }