push down: don't try to qualify with anonymous or local (IDEA-182514)

This commit is contained in:
Anna.Kozlova
2017-12-11 20:17:14 +01:00
parent f522564dbc
commit 0215ae194c
4 changed files with 56 additions and 2 deletions
@@ -192,12 +192,12 @@ public class JavaPushDownDelegate extends PushDownDelegate<MemberInfo, PsiMember
final List<PsiReference> refsToRebind = new ArrayList<>();
final PsiModifierList list = member.getModifierList();
LOG.assertTrue(list != null);
if (list.hasModifierProperty(PsiModifier.STATIC)) {
if (list.hasModifierProperty(PsiModifier.STATIC) && !PsiUtil.isLocalOrAnonymousClass(targetClass)) {
for (final PsiReference reference : ReferencesSearch.search(member)) {
final PsiElement element = reference.getElement();
if (element instanceof PsiReferenceExpression) {
final PsiExpression qualifierExpression = ((PsiReferenceExpression)element).getQualifierExpression();
if (qualifierExpression instanceof PsiReferenceExpression && !(((PsiReferenceExpression)qualifierExpression).resolve() instanceof PsiClass)) {
if (qualifierExpression instanceof PsiReferenceExpression && !(((PsiReferenceExpression)qualifierExpression).resolve() instanceof PsiClass) || qualifierExpression == null) {
continue;
}
}
@@ -0,0 +1,19 @@
class Foo {
public static void f<caret>oo() {
}
void m() {
class FooExt extends Foo {
{
foo();
}
}
class FooExt1 extends Foo {
{
foo();
}
}
}
}
@@ -0,0 +1,24 @@
class Foo {
void m() {
class FooExt extends Foo {
{
foo();
}
public static void foo() {
}
}
class FooExt1 extends Foo {
{
foo();
}
public static void foo() {
}
}
}
}
@@ -27,6 +27,7 @@ import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
@@ -127,6 +128,16 @@ public class PushDownTest extends LightRefactoringTestCase {
});
}
public void testStaticToLocalWithReferenceUpdate() {
doTest(conflicts -> {
assertSameElements(conflicts.values(),
Arrays.asList("Method <b><code>m()</code></b> uses method <b><code>foo()</code></b>, which is pushed down",
"Method <b><code>m()</code></b> uses method <b><code>foo()</code></b>, which is pushed down",
"Static method <b><code>foo()</code></b> can't be pushed to non-static class <b><code>FooExt1</code></b>",
"Static method <b><code>foo()</code></b> can't be pushed to non-static class <b><code>FooExt</code></b>"));
});
}
private void doTest() {
doTest(false);
}