diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeNewOperatorTypeFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeNewOperatorTypeFix.java index 271f1c53b2cd..b1bcb2f2c529 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeNewOperatorTypeFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeNewOperatorTypeFix.java @@ -26,6 +26,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.refactoring.introduceVariable.PsiExpressionTrimRenderer; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -42,7 +43,7 @@ public class ChangeNewOperatorTypeFix implements IntentionAction { @NotNull public String getText() { - return QuickFixBundle.message("change.new.operator.type.text", myExpression.getText(), myType.getPresentableText(), myType instanceof PsiArrayType ? "" : "()"); + return QuickFixBundle.message("change.new.operator.type.text", new PsiExpressionTrimRenderer.RenderFunction().fun(myExpression), myType.getPresentableText(), myType instanceof PsiArrayType ? "" : "()"); } @NotNull @@ -81,10 +82,17 @@ public class ChangeNewOperatorTypeFix implements IntentionAction { selection = new TextRange(caretOffset, caretOffset+1); } else { - newExpression = (PsiNewExpression)factory.createExpressionFromText("new " + toType.getCanonicalText() + "()", originalExpression); + final PsiAnonymousClass anonymousClass = originalExpression.getAnonymousClass(); + newExpression = (PsiNewExpression)factory.createExpressionFromText("new " + toType.getCanonicalText() + "()" + (anonymousClass != null ? "{}" : ""), originalExpression); PsiExpressionList argumentList = originalExpression.getArgumentList(); if (argumentList == null) return; newExpression.getArgumentList().replace(argumentList); + if (anonymousClass != null) { + final PsiAnonymousClass newAnonymousClass = (PsiAnonymousClass)newExpression.getAnonymousClass().replace(anonymousClass); + final PsiClass aClass = PsiUtil.resolveClassInType(toType); + assert aClass != null; + newAnonymousClass.getBaseClassReference().replace(factory.createClassReferenceElement(aClass)); + } selection = null; caretOffset = -1; } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/PsiExpressionTrimRenderer.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/PsiExpressionTrimRenderer.java index 2da0395db831..e3dc54066fa4 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/PsiExpressionTrimRenderer.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/PsiExpressionTrimRenderer.java @@ -190,12 +190,15 @@ public class PsiExpressionTrimRenderer extends JavaRecursiveElementWalkingVisito myBuf.append(PsiKeyword.NEW).append(" ").append(reference.getText()); final PsiExpression[] arrayDimensions = expr.getArrayDimensions(); + final PsiType type = expr.getType(); + final int dimensions = type != null ? type.getArrayDimensions() : arrayDimensions.length; if (arrayDimensions.length > 0) myBuf.append("["); - boolean first = true; - for (PsiExpression dimension : arrayDimensions) { - if (!first) myBuf.append(", "); - first = false; - dimension.accept(this); + for (int i = 0, arrayDimensionsLength = arrayDimensions.length; i < dimensions; i++) { + final PsiExpression dimension = i < arrayDimensionsLength ? arrayDimensions[i] : null; + if (i > 0) myBuf.append("]["); + if (dimension != null) { + dimension.accept(this); + } } if (arrayDimensions.length > 0) myBuf.append("]"); @@ -221,4 +224,4 @@ public class PsiExpressionTrimRenderer extends JavaRecursiveElementWalkingVisito return buf.toString(); } } -} \ No newline at end of file +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterAnonymousClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterAnonymousClass.java new file mode 100644 index 000000000000..7a7121d4491b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterAnonymousClass.java @@ -0,0 +1,9 @@ +// "Change 'new Runnable() {...}' to 'new StringBuffer()'" "true" + +class X { + public StringBuffer buf = new StringBuffer(){ + public void run(){ + System.out.println("smth"); + } + }; + } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterArgs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterArgs.java index 828373c10314..b1517a3f3401 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterArgs.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterArgs.java @@ -1,8 +1,8 @@ -// "Change 'new ArrayList(2)' to 'new ArrayList()'" "true" +// "Change 'new ArrayList(...)' to 'new ArrayList()'" "true" import java.util.*; class RRR { void f() { List l = new ArrayList(2); } -} \ No newline at end of file +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeAnonymousClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeAnonymousClass.java new file mode 100644 index 000000000000..6750c4eb9d64 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeAnonymousClass.java @@ -0,0 +1,9 @@ +// "Change 'new Runnable() {...}' to 'new StringBuffer()'" "true" + +class X { + public StringBuffer buf = new Runnable(){ + public void run(){ + System.out.println("smth"); + } + }; + } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeArgs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeArgs.java index 838e772adf62..ff693955ea1b 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeArgs.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeArgs.java @@ -1,8 +1,8 @@ -// "Change 'new ArrayList(2)' to 'new ArrayList()'" "true" +// "Change 'new ArrayList(...)' to 'new ArrayList()'" "true" import java.util.*; class RRR { void f() { List l = new ArrayList(2); } -} \ No newline at end of file +}