diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java index 3a6f26048340..29fafed6a148 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java @@ -142,7 +142,8 @@ public class JavaIntroduceParameterMethodUsagesProcessor implements IntroducePar public void findConflicts(IntroduceParameterData data, UsageInfo[] usages, final MultiMap conflicts) { - final int parametersCount = data.getMethodToReplaceIn().getParameterList().getParametersCount(); + final PsiMethod method = data.getMethodToReplaceIn(); + final int parametersCount = method.getParameterList().getParametersCount(); for (UsageInfo usage : usages) { if (!isMethodUsage(usage)) continue; final PsiElement element = usage.getElement(); @@ -150,7 +151,8 @@ public class JavaIntroduceParameterMethodUsagesProcessor implements IntroducePar final PsiExpressionList argList = call.getArgumentList(); if (argList != null) { final int actualParamLength = argList.getExpressions().length; - if (actualParamLength < parametersCount) { + if ((method.isVarArgs() && actualParamLength + 1 < parametersCount) || + (!method.isVarArgs() && actualParamLength < parametersCount)) { conflicts.putValue(call, "Incomplete call(" + call.getText() +"): " + parametersCount + " parameters expected but only " + actualParamLength + " found"); } data.getParametersToRemove().forEach(new TIntProcedure() { diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeIncompleteVararg.java b/java/java-tests/testData/refactoring/introduceParameter/beforeIncompleteVararg.java new file mode 100644 index 000000000000..886c91363281 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/beforeIncompleteVararg.java @@ -0,0 +1,10 @@ +class C { + void method(int k, String... s) { + System.out.println(s[k]); + } + + { + method("a", "b", "c"); + method(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java index ed788b2c29a4..02ca2417184e 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java @@ -168,7 +168,12 @@ public class IntroduceParameterTest extends LightCodeInsightTestCase { } public void testParameterJavaDocBeforeVararg() throws Exception { - doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, true, false, "Incomplete call(method()): 1 parameters expected but only 0 found"); + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, false, false, true, false); + } + + public void testIncompleteVararg() throws Exception { + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE, true, false, true, false, "Incomplete call(method()): 2 parameters expected but only 0 found\n" + + "Incomplete call(method()): expected to delete the 0 parameter but only 0 parameters found"); } public void testIncorrectScope() throws Exception {