extract method: reject containing classes when members were called through inheritance chain

This commit is contained in:
Anna Kozlova
2013-05-29 17:48:38 +04:00
parent 46c05691a6
commit 3b736aca09
4 changed files with 42 additions and 0 deletions
@@ -405,6 +405,14 @@ public class ControlFlowUtil {
if (parent instanceof PsiClass) {
final PsiClass clss = (PsiClass)parent;
if (PsiTreeUtil.isAncestor(targetClassMember, clss, false)) return false;
PsiClass containingClass = PsiTreeUtil.getParentOfType(ref, PsiClass.class);
while (containingClass != null) {
if (containingClass.isInheritor(clss, true) &&
PsiTreeUtil.isAncestor(targetClassMember, containingClass, false)) {
return false;
}
containingClass = containingClass.getContainingClass();
}
}
}
@@ -0,0 +1,13 @@
public class Foo {
public void update() {}
}
class FooBar {
{
Foo tm = new Foo() {
{
<selection>update()</selection>;
}
};
}
}
@@ -0,0 +1,17 @@
public class Foo {
public void update() {}
}
class FooBar {
{
Foo tm = new Foo() {
{
newMethod();
}
private void newMethod() {
update();
}
};
}
}
@@ -583,6 +583,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase {
doDuplicatesTest();
}
public void testTargetAnonymous() throws Exception {
doTest();
}
private void doTestDisabledParam() throws PrepareFailedException {
final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject());
settings.ELSE_ON_NEW_LINE = true;