diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index 9277ddc672c2..0313d99c3356 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -314,7 +314,27 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { public static void inlineConstructorCall(PsiCall constructorCall) { final PsiMethod oldConstructor = constructorCall.resolveMethod(); LOG.assertTrue(oldConstructor != null); - final PsiExpression[] instanceCreationArguments = constructorCall.getArgumentList().getExpressions(); + PsiExpression[] instanceCreationArguments = constructorCall.getArgumentList().getExpressions(); + if (oldConstructor.isVarArgs()) { //wrap with explicit array + final PsiParameter[] parameters = oldConstructor.getParameterList().getParameters(); + final PsiType varargType = parameters[parameters.length - 1].getType(); + if (varargType instanceof PsiEllipsisType) { + final PsiType arrayType = + constructorCall.resolveMethodGenerics().getSubstitutor().substitute(((PsiEllipsisType)varargType).getComponentType()); + final PsiExpression[] exprs = new PsiExpression[parameters.length]; + System.arraycopy(instanceCreationArguments, 0, exprs, 0, parameters.length - 1); + StringBuffer varargs = new StringBuffer(); + for (int i = parameters.length - 1; i < instanceCreationArguments.length; i++) { + if (varargs.length() > 0) varargs.append(", "); + varargs.append(instanceCreationArguments[i].getText()); + } + + exprs[parameters.length - 1] = JavaPsiFacade.getElementFactory(constructorCall.getProject()) + .createExpressionFromText("new " + arrayType.getCanonicalText() + "[]{" + varargs.toString() + "}", constructorCall); + + instanceCreationArguments = exprs; + } + } PsiStatement[] statements = oldConstructor.getBody().getStatements(); LOG.assertTrue(statements.length == 1 && statements[0] instanceof PsiExpressionStatement); diff --git a/java/java-tests/testData/refactoring/inlineToAnonymousClass/ChainedVarargConstructors.java b/java/java-tests/testData/refactoring/inlineToAnonymousClass/ChainedVarargConstructors.java new file mode 100644 index 000000000000..a992497d5c21 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineToAnonymousClass/ChainedVarargConstructors.java @@ -0,0 +1,16 @@ +class A { + private Object b = new MyException("w"); + + private class MyException implements Runnable { + public MyException(String...msg){ + this(new Throwable(), msg[0]); + } + + public MyException(Throwable t, String msg) + { + System.out.println(msg); + } + + public void run(){} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineToAnonymousClass/ChainedVarargConstructors.java.after b/java/java-tests/testData/refactoring/inlineToAnonymousClass/ChainedVarargConstructors.java.after new file mode 100644 index 000000000000..e93dacc2e8d8 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineToAnonymousClass/ChainedVarargConstructors.java.after @@ -0,0 +1,10 @@ +class A { + private Object b = new Runnable() { + { + System.out.println(new String[]{"w"}[0]); + } + + public void run(){} + }; + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java index 1fd3b1e9d79f..01f0a50c5baf 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineToAnonymousClassTest.java @@ -144,6 +144,10 @@ public class InlineToAnonymousClassTest extends LightCodeInsightTestCase { doTest(false, false); } + public void testChainedVarargConstructors() throws Exception { + doTest(false, false); + } + public void testInlineThisOnly() throws Exception { doTest(true, false); }