diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java index 213143e0e21a..06d5ddc5f79b 100644 --- a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java +++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java @@ -197,12 +197,12 @@ public class PyClassRefactoringUtil { } private static void rememberNamedReferences(final List methods) { - for (PyFunction method : methods) { + for (final PyFunction method : methods) { method.acceptChildren(new PyRecursiveElementVisitor() { @Override public void visitPyReferenceExpression(PyReferenceExpression node) { super.visitPyReferenceExpression(node); - rememberReference(node); + rememberReference(node, method); } }); } @@ -210,13 +210,13 @@ public class PyClassRefactoringUtil { private static final Key ENCODED_IMPORT = Key.create("PyEncodedImport"); - private static void rememberReference(PyReferenceExpression node) { + private static void rememberReference(PyReferenceExpression node, PyFunction method) { // we will remember reference in deepest node if (node.getQualifier() instanceof PyReferenceExpression) return; final PsiPolyVariantReference ref = node.getReference(); final PsiElement target = ref.resolve(); - if (target instanceof PsiNamedElement) { + if (target instanceof PsiNamedElement && !PsiTreeUtil.isAncestor(method, target, false)) { node.putCopyableUserData(ENCODED_IMPORT, (PsiNamedElement)target); } } diff --git a/python/testData/refactoring/pullup/multiFile/Class.py b/python/testData/refactoring/pullup/multiFile/Class.py new file mode 100644 index 000000000000..ddf8ded026cd --- /dev/null +++ b/python/testData/refactoring/pullup/multiFile/Class.py @@ -0,0 +1,5 @@ +from SuperClass import SuperClass + +class AnyClass(SuperClass): + def this_should_be_in_super(self, some_argument): + self.argument = some_argument diff --git a/python/testData/refactoring/pullup/multiFile/SuperClass.after.py b/python/testData/refactoring/pullup/multiFile/SuperClass.after.py new file mode 100644 index 000000000000..1466568d7581 --- /dev/null +++ b/python/testData/refactoring/pullup/multiFile/SuperClass.after.py @@ -0,0 +1,6 @@ +class SuperClass(object): + def __init__(self): + pass + + def this_should_be_in_super(self, some_argument): + self.argument = some_argument diff --git a/python/testData/refactoring/pullup/multiFile/SuperClass.py b/python/testData/refactoring/pullup/multiFile/SuperClass.py new file mode 100644 index 000000000000..a41b8fdc7db1 --- /dev/null +++ b/python/testData/refactoring/pullup/multiFile/SuperClass.py @@ -0,0 +1,3 @@ +class SuperClass(object): + def __init__(self): + pass diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java index 1748f49ca095..19742fad873e 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java @@ -30,13 +30,23 @@ public class PyPullUpTest extends PyClassRefactoringTest { doHelperTest("Boo", ".boo", "Foo"); } + public void testMultiFile() { // PY-2810 + myFixture.copyDirectoryToProject("refactoring/pullup/multiFile/", ""); + doPullUp("AnyClass", ".this_should_be_in_super", "SuperClass"); + myFixture.checkResultByFile("SuperClass.py", "/refactoring/pullup/multiFile/SuperClass.after.py", true); + } + private void doHelperTest(final String className, final String memberName, final String superClassName) { String baseName = "/refactoring/pullup/" + getTestName(true); myFixture.configureByFile(baseName + ".py"); + doPullUp(className, memberName, superClassName); + myFixture.checkResultByFile(baseName + ".after.py"); + } + + private void doPullUp(String className, String memberName, String superClassName) { final PyClass clazz = findClass(className); final PyElement member = findMember(className, memberName); final PyClass superClass = findClass(superClassName); PyPullUpHelper.pullUp(clazz, Collections.singleton(new PyMemberInfo(member)), superClass); - myFixture.checkResultByFile(baseName + ".after.py"); } }