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;