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 dd808a94a12d..5ae7c8613e07 100644 --- a/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java @@ -26,6 +26,7 @@ import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.impl.PsiDiamondTypeUtil; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; @@ -184,8 +185,12 @@ public class AnonymousToInnerHandler implements RefactoringActionHandler { } } buf.append(")"); - PsiExpression newClassExpression = JavaPsiFacade.getInstance(myManager.getProject()).getElementFactory().createExpressionFromText(buf.toString(), null); - newExpr.replace(newClassExpression); + PsiNewExpression newClassExpression = + (PsiNewExpression)JavaPsiFacade.getInstance(myManager.getProject()).getElementFactory().createExpressionFromText(buf.toString(), null); + newClassExpression = (PsiNewExpression)newExpr.replace(newClassExpression); + if (PsiDiamondTypeUtil.canCollapseToDiamond(newClassExpression, newClassExpression, newClassExpression.getType())) { + PsiDiamondTypeUtil.replaceExplicitWithDiamond(newClassExpression.getClassOrAnonymousClassReference().getParameterList()); + } } @Nullable diff --git a/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic_after.java b/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic_after.java index f56eeb0391ed..4bcfab1cb5bd 100644 --- a/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic_after.java +++ b/java/java-tests/testData/refactoring/anonymousToInner/canBeStatic_after.java @@ -1,6 +1,6 @@ public class Foo { public void foo() { - Predicate predicate = new MyPredicate(); + Predicate predicate = new MyPredicate<>(); } private interface Predicate { diff --git a/java/java-tests/testData/refactoring/anonymousToInner/collapseDiamonds.java b/java/java-tests/testData/refactoring/anonymousToInner/collapseDiamonds.java new file mode 100644 index 000000000000..dd7ca4915b75 --- /dev/null +++ b/java/java-tests/testData/refactoring/anonymousToInner/collapseDiamonds.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/collapseDiamonds_after.java b/java/java-tests/testData/refactoring/anonymousToInner/collapseDiamonds_after.java new file mode 100644 index 000000000000..4bcfab1cb5bd --- /dev/null +++ b/java/java-tests/testData/refactoring/anonymousToInner/collapseDiamonds_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/testData/refactoring/anonymousToInner/genericTypeParameters_after.java b/java/java-tests/testData/refactoring/anonymousToInner/genericTypeParameters_after.java index aa7fe1d30f5d..9ee35687cb2a 100644 --- a/java/java-tests/testData/refactoring/anonymousToInner/genericTypeParameters_after.java +++ b/java/java-tests/testData/refactoring/anonymousToInner/genericTypeParameters_after.java @@ -2,7 +2,7 @@ import java.util.*; class A { public Iterator> iterator(long revision) { - return new MyIterator(); + return new MyIterator<>(); } private static class MyIterator implements Iterator> { diff --git a/java/java-tests/testSrc/com/intellij/refactoring/AnonymousToInnerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/AnonymousToInnerTest.java index 1dcfc7ab39e5..71fa16179846 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/AnonymousToInnerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/AnonymousToInnerTest.java @@ -38,6 +38,10 @@ public class AnonymousToInnerTest extends LightCodeInsightTestCase { doTest("MyRunnable", true); } + public void testCollapseDiamonds() throws Exception { // IDEADEV-29446 + doTest("MyPredicate", true); + } + public void testCanBeStatic() throws Exception { configureByFile(TEST_ROOT + getTestName(true) + ".java"); AnonymousToInnerHandler handler = new AnonymousToInnerHandler(){