From 685e33675cce5c651d3741bb20c4ba8d1a1f5ce8 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Sat, 9 Jun 2012 21:29:45 +0400 Subject: [PATCH] convert anonym to inner: ignore used type params as they would be propagated anyway (IDEA-87171) --- .../AnonymousToInnerHandler.java | 2 +- .../util/classMembers/ElementNeedsThis.java | 5 +++++ .../anonymousToInner/canBeStatic.java | 14 ++++++++++++++ .../anonymousToInner/canBeStatic_after.java | 16 ++++++++++++++++ .../refactoring/AnonymousToInnerTest.java | 16 ++++++++++++++++ 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/anonymousToInner/canBeStatic.java create mode 100644 java/java-tests/testData/refactoring/anonymousToInner/canBeStatic_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java b/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java index f53f8523253b..dd808a94a12d 100644 --- a/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java @@ -240,7 +240,7 @@ public class AnonymousToInnerHandler implements RefactoringActionHandler { } private Boolean cachedNeedsThis = null; - private boolean needsThis() { + public boolean needsThis() { if(cachedNeedsThis == null) { ElementNeedsThis memberNeedsThis = new ElementNeedsThis(myTargetClass, myAnonClass); diff --git a/java/java-impl/src/com/intellij/refactoring/util/classMembers/ElementNeedsThis.java b/java/java-impl/src/com/intellij/refactoring/util/classMembers/ElementNeedsThis.java index 97a898a3cf0b..9531eccdace8 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/classMembers/ElementNeedsThis.java +++ b/java/java-impl/src/com/intellij/refactoring/util/classMembers/ElementNeedsThis.java @@ -41,9 +41,14 @@ public class ElementNeedsThis extends ClassThisReferencesVisitor { if (classMember == null || classMember.equals(myMember)) return; if (classMember.hasModifierProperty(PsiModifier.STATIC)) return; + if (ignoreUsedTypeParams() && classMember instanceof PsiTypeParameter) return; myResult = true; } + protected boolean ignoreUsedTypeParams() { + return myMember != null; + } + protected void visitExplicitThis(PsiClass referencedClass, PsiThisExpression reference) { myResult = true; } diff --git a/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic.java b/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic.java new file mode 100644 index 000000000000..dd7ca4915b75 --- /dev/null +++ b/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic.java @@ -0,0 +1,14 @@ +public class Foo { + public void foo() { + Predicate predicate = new Predicate() { + @Override + public boolean test(T t) { + return false; + } + }; + } + + private interface Predicate { + boolean test(K t); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic_after.java b/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic_after.java new file mode 100644 index 000000000000..f56eeb0391ed --- /dev/null +++ b/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic_after.java @@ -0,0 +1,16 @@ +public class Foo { + public void foo() { + Predicate predicate = new MyPredicate(); + } + + private interface Predicate { + boolean test(K t); + } + + private static class MyPredicate implements Predicate { + @Override + public boolean test(T t) { + return false; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/AnonymousToInnerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/AnonymousToInnerTest.java index 171393c03a47..1dcfc7ab39e5 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/AnonymousToInnerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/AnonymousToInnerTest.java @@ -37,6 +37,22 @@ public class AnonymousToInnerTest extends LightCodeInsightTestCase { public void testInsideInterface() throws Exception { // IDEADEV-29446 doTest("MyRunnable", true); } + + public void testCanBeStatic() throws Exception { + configureByFile(TEST_ROOT + getTestName(true) + ".java"); + AnonymousToInnerHandler handler = new AnonymousToInnerHandler(){ + @Override + protected boolean showRefactoringDialog() { + myNewClassName = "MyPredicate"; + myMakeStatic = !needsThis(); + return true; + } + }; + handler.invoke(getProject(), myEditor, myFile, null); + assertFalse(handler.needsThis()); + checkResultByFile(TEST_ROOT + getTestName(true) + "_after.java"); + } + private void doTest(final String newClassName, final boolean makeStatic) throws Exception { configureByFile(TEST_ROOT + getTestName(true) + ".java");