diff --git a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java index 32fd53b56f0e..d5543618fc87 100644 --- a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java @@ -96,10 +96,8 @@ public class PyProtectedMemberInspection extends PyInspection { } } final PyType type = myTypeEvalContext.getType(qualifier); - if (type instanceof PyModuleType) - registerProblem(node, PyBundle.message("INSP.protected.member.$0.access.module", name)); - else - registerProblem(node, PyBundle.message("INSP.protected.member.$0.access", name)); + final String bundle_key = type instanceof PyModuleType ? "INSP.protected.member.$0.access.module" : "INSP.protected.member.$0.access"; + registerProblem(node, PyBundle.message(bundle_key, name), new PyRenameElementQuickFix()); } } diff --git a/python/src/com/jetbrains/python/inspections/PyRenameElementQuickFix.java b/python/src/com/jetbrains/python/inspections/PyRenameElementQuickFix.java index b136b45a271e..db3629177e6d 100644 --- a/python/src/com/jetbrains/python/inspections/PyRenameElementQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/PyRenameElementQuickFix.java @@ -25,6 +25,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNameIdentifierOwner; +import com.intellij.psi.PsiReference; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.PsiSearchHelper; import com.intellij.psi.search.SearchScope; @@ -35,6 +36,7 @@ import com.intellij.refactoring.rename.RenamePsiElementProcessor; import com.intellij.refactoring.rename.inplace.VariableInplaceRenamer; import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil; import com.jetbrains.python.psi.PyNamedParameter; +import com.jetbrains.python.psi.PyReferenceExpression; import com.jetbrains.python.psi.PyTargetExpression; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -57,7 +59,12 @@ public class PyRenameElementQuickFix implements LocalQuickFix { @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { - final PsiElement element = descriptor.getPsiElement(); + PsiElement element = descriptor.getPsiElement(); + if (element instanceof PyReferenceExpression) { + final PsiReference reference = element.getReference(); + if (reference == null) return; + element = reference.resolve(); + } final PsiNameIdentifierOwner nameOwner = element instanceof PsiNameIdentifierOwner ? (PsiNameIdentifierOwner)element : PsiTreeUtil.getParentOfType(element, PsiNameIdentifierOwner.class, true); diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/pep8.py b/python/testData/quickFixes/RenameElementQuickFixTest/pep8.py new file mode 100644 index 000000000000..10c7b3354a34 --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/pep8.py @@ -0,0 +1,2 @@ +def foo(): + ABC = "test" \ No newline at end of file diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/pep8Class.py b/python/testData/quickFixes/RenameElementQuickFixTest/pep8Class.py new file mode 100644 index 000000000000..8a2263355d69 --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/pep8Class.py @@ -0,0 +1,2 @@ +class a_b: + pass \ No newline at end of file diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/pep8Class_after.py b/python/testData/quickFixes/RenameElementQuickFixTest/pep8Class_after.py new file mode 100644 index 000000000000..b3f1e941b6f6 --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/pep8Class_after.py @@ -0,0 +1,2 @@ +class a: + pass \ No newline at end of file diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/pep8Function.py b/python/testData/quickFixes/RenameElementQuickFixTest/pep8Function.py new file mode 100644 index 000000000000..7a358d7e7404 --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/pep8Function.py @@ -0,0 +1 @@ +def Foo(): pass \ No newline at end of file diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/pep8Function_after.py b/python/testData/quickFixes/RenameElementQuickFixTest/pep8Function_after.py new file mode 100644 index 000000000000..b77eecbf7a5f --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/pep8Function_after.py @@ -0,0 +1 @@ +def a(): pass \ No newline at end of file diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/pep8_after.py b/python/testData/quickFixes/RenameElementQuickFixTest/pep8_after.py new file mode 100644 index 000000000000..35d3edfb9784 --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/pep8_after.py @@ -0,0 +1,2 @@ +def foo(): + a = "test" \ No newline at end of file diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/protectedMember.py b/python/testData/quickFixes/RenameElementQuickFixTest/protectedMember.py new file mode 100644 index 000000000000..1ebf07a829d4 --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/protectedMember.py @@ -0,0 +1,14 @@ + + +class A: + def __init__(self): + self._x = 1 + + def _foo(self): + pass + + +a_class = A() +a_class._foo() +print(a_class._x) + diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/protectedMember_after.py b/python/testData/quickFixes/RenameElementQuickFixTest/protectedMember_after.py new file mode 100644 index 000000000000..878732079fb8 --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/protectedMember_after.py @@ -0,0 +1,14 @@ + + +class A: + def __init__(self): + self.a = 1 + + def _foo(self): + pass + + +a_class = A() +a_class._foo() +print(a_class.a) + diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/shadowingBuiltins.py b/python/testData/quickFixes/RenameElementQuickFixTest/shadowingBuiltins.py new file mode 100644 index 000000000000..fdbc5a5815a6 --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/shadowingBuiltins.py @@ -0,0 +1,2 @@ +def foo(): + len = 10 \ No newline at end of file diff --git a/python/testData/quickFixes/RenameElementQuickFixTest/shadowingBuiltins_after.py b/python/testData/quickFixes/RenameElementQuickFixTest/shadowingBuiltins_after.py new file mode 100644 index 000000000000..d8335e594f59 --- /dev/null +++ b/python/testData/quickFixes/RenameElementQuickFixTest/shadowingBuiltins_after.py @@ -0,0 +1,2 @@ +def foo(): + a = 10 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/quickFixes/RenameElementQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/RenameElementQuickFixTest.java new file mode 100644 index 000000000000..5a63b49b66e6 --- /dev/null +++ b/python/testSrc/com/jetbrains/python/quickFixes/RenameElementQuickFixTest.java @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.python.quickFixes; + +import com.intellij.testFramework.TestDataPath; +import com.jetbrains.python.PyQuickFixTestCase; +import com.jetbrains.python.inspections.PyPep8NamingInspection; +import com.jetbrains.python.inspections.PyProtectedMemberInspection; +import com.jetbrains.python.inspections.PyShadowingBuiltinsInspection; + +/** + * User: ktisha + */ +@TestDataPath("$CONTENT_ROOT/../testData//quickFixes/RenameElementQuickFixTest/") +public class RenameElementQuickFixTest extends PyQuickFixTestCase { + + public void testProtectedMember() { + doQuickFixTest(PyProtectedMemberInspection.class, "Rename element"); + } + + public void testPep8() { + doQuickFixTest(PyPep8NamingInspection.class, "Rename element"); + } + + public void testPep8Class() { + doQuickFixTest(PyPep8NamingInspection.class, "Rename element"); + } + + public void testPep8Function() { + doQuickFixTest(PyPep8NamingInspection.class, "Rename element"); + } + + public void testShadowingBuiltins() { + doQuickFixTest(PyShadowingBuiltinsInspection.class, "Rename element"); + } + +}