diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java index f31fb7ccadb3..66dc2612adde 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java @@ -473,16 +473,41 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem if (element.getParent() instanceof PsiMethodCallExpression) { PsiMethodCallExpression methodCall = (PsiMethodCallExpression)element.getParent(); + if (myMethodToReplaceIn == myMethodToSearchFor && PsiTreeUtil.isAncestor(methodCall, myParameterInitializer, false)) return; + PsiElementFactory factory = JavaPsiFacade.getInstance(methodCall.getProject()).getElementFactory(); PsiExpression expression = factory.createExpressionFromText(myParameterName, null); final PsiExpressionList argList = methodCall.getArgumentList(); final PsiExpression[] exprs = argList.getExpressions(); - if (exprs.length > 0) { - argList.addAfter(expression, exprs[exprs.length - 1]); + boolean first = false; + PsiElement anchor = null; + if (myMethodToSearchFor.isVarArgs()) { + final int oldParamCount = myMethodToSearchFor.getParameterList().getParametersCount() - 1; + if (exprs.length >= oldParamCount) { + if (oldParamCount > 1) { + anchor = exprs[oldParamCount - 2]; + } + else { + first = true; + anchor = null; + } + } else { + anchor = exprs[exprs.length -1]; + } + } else if (exprs.length > 0) { + anchor = exprs[exprs.length - 1]; + } + + if (anchor != null) { + argList.addAfter(expression, anchor); } else { - argList.add(expression); + if (first && exprs.length > 0) { + argList.addBefore(expression, exprs[0]); + } else { + argList.add(expression); + } } removeParametersFromCall(argList); diff --git a/java/java-tests/testData/refactoring/introduceParameter/afterSelfReference.java b/java/java-tests/testData/refactoring/introduceParameter/afterSelfReference.java new file mode 100644 index 000000000000..9ade5ad0ce0d --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/afterSelfReference.java @@ -0,0 +1,9 @@ +class Test { + void foo(boolean flag, int i, final int anObject) { + if (flag) { + foo(false, i, anObject); + } + System.out.println(); + foo(false, i, anObject); + } +} diff --git a/java/java-tests/testData/refactoring/introduceParameter/afterSelfReferenceVarargs.java b/java/java-tests/testData/refactoring/introduceParameter/afterSelfReferenceVarargs.java new file mode 100644 index 000000000000..c088fd248d90 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/afterSelfReferenceVarargs.java @@ -0,0 +1,9 @@ +class Test { + void foo(boolean flag, final String anObject, int... i) { + if (flag) { + foo(false, anObject, i); + } + System.out.println(); + foo(flag, anObject, i); + } +} diff --git a/java/java-tests/testData/refactoring/introduceParameter/afterSelfReferenceVarargs1.java b/java/java-tests/testData/refactoring/introduceParameter/afterSelfReferenceVarargs1.java new file mode 100644 index 000000000000..ffcb8ac6d08d --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/afterSelfReferenceVarargs1.java @@ -0,0 +1,6 @@ +class Test { + void foo(final String anObject, int... i) { + foo(anObject, 1); + foo(anObject, 3); + } +} diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeSelfReference.java b/java/java-tests/testData/refactoring/introduceParameter/beforeSelfReference.java new file mode 100644 index 000000000000..11a05df1d76a --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/beforeSelfReference.java @@ -0,0 +1,9 @@ +class Test { + void foo(boolean flag, int i) { + if (flag) { + foo(false, i, i + 1); + } + System.out.println(); + foo(false, i); + } +} diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeSelfReferenceVarargs.java b/java/java-tests/testData/refactoring/introduceParameter/beforeSelfReferenceVarargs.java new file mode 100644 index 000000000000..407baf138b3a --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/beforeSelfReferenceVarargs.java @@ -0,0 +1,9 @@ +class Test { + void foo(boolean flag, int... i) { + if (flag) { + foo(false, "", i); + } + System.out.println(); + foo(flag, i); + } +} diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeSelfReferenceVarargs1.java b/java/java-tests/testData/refactoring/introduceParameter/beforeSelfReferenceVarargs1.java new file mode 100644 index 000000000000..197d75cf46c0 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/beforeSelfReferenceVarargs1.java @@ -0,0 +1,6 @@ +class Test { + void foo(int... i) { + foo("", 1); + foo(3); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java index e94b4c772360..4893ce72e001 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java @@ -283,6 +283,18 @@ public class IntroduceParameterTest extends LightRefactoringTestCase { doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, true); } + public void testSelfReference() throws Exception { + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, false); + } + + public void testSelfReferenceVarargs() throws Exception { + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, false); + } + + public void testSelfReferenceVarargs1() throws Exception { + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, false); + } + private void doTestThroughHandler() throws Exception { configureByFile("/refactoring/introduceParameter/before" + getTestName(false) + ".java"); boolean enabled = true;