diff --git a/python/src/com/jetbrains/python/PyBundle.properties b/python/src/com/jetbrains/python/PyBundle.properties index 52b3f491fe8c..84ce4c1800d0 100644 --- a/python/src/com/jetbrains/python/PyBundle.properties +++ b/python/src/com/jetbrains/python/PyBundle.properties @@ -62,7 +62,7 @@ QFIX.statement.effect.move.docstring=Move docstring to the proper place QFIX.statement.effect.introduce.variable=Introduce variable -QFIX.unresolved.reference=Replace ''{0}'' with ''self.{0}'' +QFIX.unresolved.reference=Replace ''{0}'' with ''{1}.{0}'' QFIX.unresolved.reference.add.param.$0=Create parameter ''{0}'' QFIX.unresolved.reference.add.param=Create parameter for reference diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index f2b8d4636468..69d469af1113 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -709,11 +709,23 @@ public class PyUnresolvedReferencesInspection extends PyInspection { } private void addAddSelfFix(PyElement node, PyReferenceExpression refex, List actions) { - PyClass containedClass = PsiTreeUtil.getParentOfType(node, PyClass.class); - if (containedClass != null) { + final PyClass containedClass = PsiTreeUtil.getParentOfType(node, PyClass.class); + final PyFunction function = PsiTreeUtil.getParentOfType(node, PyFunction.class); + if (containedClass != null && function != null) { + final PyParameter[] parameters = function.getParameterList().getParameters(); + final String qualifier = parameters[0].getText(); + if (parameters.length == 0) return; + final PyDecoratorList decoratorList = function.getDecoratorList(); + boolean isClassmethod = false; + if (decoratorList != null) { + for (PyDecorator decorator : decoratorList.getDecorators()) { + if (PyNames.CLASSMETHOD.equals(decorator.getCallee().getText())) + isClassmethod = true; + } + } for (PyTargetExpression target : containedClass.getInstanceAttributes()) { - if (Comparing.strEqual(node.getName(), target.getName())) { - actions.add(new UnresolvedReferenceAddSelfQuickFix(refex)); + if (!isClassmethod && Comparing.strEqual(node.getName(), target.getName())) { + actions.add(new UnresolvedReferenceAddSelfQuickFix(refex, qualifier)); } } for (PyStatement statement : containedClass.getStatementList().getStatements()) { @@ -725,7 +737,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { PyType type = myTypeEvalContext.getType(callexpr); if (type != null && type instanceof PyClassTypeImpl) { if (((PyCallExpression)callexpr).isCalleeText(PyNames.PROPERTY)) { - actions.add(new UnresolvedReferenceAddSelfQuickFix(refex)); + actions.add(new UnresolvedReferenceAddSelfQuickFix(refex, qualifier)); } } } @@ -734,7 +746,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { } for (PyFunction method : containedClass.getMethods()) { if (refex.getText().equals(method.getName())) { - actions.add(new UnresolvedReferenceAddSelfQuickFix(refex)); + actions.add(new UnresolvedReferenceAddSelfQuickFix(refex, qualifier)); } } } diff --git a/python/src/com/jetbrains/python/inspections/quickfix/UnresolvedReferenceAddSelfQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/UnresolvedReferenceAddSelfQuickFix.java index f890dbf29f2b..3eefd0cb99db 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/UnresolvedReferenceAddSelfQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/UnresolvedReferenceAddSelfQuickFix.java @@ -19,25 +19,28 @@ import org.jetbrains.annotations.NotNull; */ public class UnresolvedReferenceAddSelfQuickFix implements LocalQuickFix, HighPriorityAction { private PyReferenceExpression myElement; + private String myQualifier; - public UnresolvedReferenceAddSelfQuickFix(PyReferenceExpression element) { + public UnresolvedReferenceAddSelfQuickFix(@NotNull final PyReferenceExpression element, @NotNull final String qualifier) { myElement = element; + myQualifier = qualifier; } @NotNull public String getName() { - return PyBundle.message("QFIX.unresolved.reference", myElement.getText()); + return PyBundle.message("QFIX.unresolved.reference", myElement.getText(), myQualifier); } @NotNull public String getFamilyName() { - return "Add 'self'"; + return "Add qualifier"; } public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { - if (!FileModificationService.getInstance().preparePsiElementForWrite(myElement)) return; - PyElementGenerator elementGenerator = PyElementGenerator.getInstance(project); - PyExpression expression = elementGenerator.createExpressionFromText(LanguageLevel.forElement(myElement), "self." + myElement.getText()); - myElement.replace(expression); + if (!FileModificationService.getInstance().preparePsiElementForWrite(myElement)) return; + PyElementGenerator elementGenerator = PyElementGenerator.getInstance(project); + PyExpression expression = elementGenerator.createExpressionFromText(LanguageLevel.forElement(myElement), + myQualifier + "." + myElement.getText()); + myElement.replace(expression); } } diff --git a/python/testData/inspections/AddSelfToClassmethod.py b/python/testData/inspections/AddSelfToClassmethod.py new file mode 100644 index 000000000000..92d7bdf21cc6 --- /dev/null +++ b/python/testData/inspections/AddSelfToClassmethod.py @@ -0,0 +1,7 @@ +class A: + def foo(self): + pass + + @classmethod + def pop(cls): + print foo() \ No newline at end of file diff --git a/python/testData/inspections/AddSelfToClassmethod_after.py b/python/testData/inspections/AddSelfToClassmethod_after.py new file mode 100644 index 000000000000..a99249fe9f78 --- /dev/null +++ b/python/testData/inspections/AddSelfToClassmethod_after.py @@ -0,0 +1,7 @@ +class A: + def foo(self): + pass + + @classmethod + def pop(cls): + print cls.foo() \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java index 2e67d8a67592..5cbe74c34835 100644 --- a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java +++ b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java @@ -83,7 +83,12 @@ public class PyQuickFixTest extends PyTestCase { public void testAddSelfFunction() { //PY-4556 doInspectionTest("AddSelfFunction.py", - PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.unresolved.reference", "get_a"), true, true); + PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.unresolved.reference", "get_a", "self"), true, true); + } + + public void testAddSelfToClassmethod() { //PY-9721 + doInspectionTest("AddSelfToClassmethod.py", + PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.unresolved.reference", "foo", "cls"), true, true); } public void testAddCls() {