mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
don't try to import references that resolve in the method being pulled up (PY-2810)
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user