don't try to import references that resolve in the method being pulled up (PY-2810)

This commit is contained in:
Dmitry Jemerov
2011-02-02 17:50:11 +01:00
parent 2c369762db
commit deff48c064
5 changed files with 29 additions and 5 deletions
@@ -197,12 +197,12 @@ public class PyClassRefactoringUtil {
}
private static void rememberNamedReferences(final List<PyFunction> 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<PsiNamedElement> 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);
}
}
@@ -0,0 +1,5 @@
from SuperClass import SuperClass
class AnyClass(SuperClass):
def this_should_be_in_super(self, some_argument):
self.argument = some_argument
@@ -0,0 +1,6 @@
class SuperClass(object):
def __init__(self):
pass
def this_should_be_in_super(self, some_argument):
self.argument = some_argument
@@ -0,0 +1,3 @@
class SuperClass(object):
def __init__(self):
pass
@@ -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");
}
}