diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/JavaIntroduceParameterObjectClassDescriptor.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/JavaIntroduceParameterObjectClassDescriptor.java index 069aa33ab90d..4b59bdedda03 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/JavaIntroduceParameterObjectClassDescriptor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/JavaIntroduceParameterObjectClassDescriptor.java @@ -204,7 +204,8 @@ public class JavaIntroduceParameterObjectClassDescriptor extends IntroduceParame final PsiVariable[] constructorParams = compatibleConstructor != null ? compatibleConstructor.getParameterList().getParameters() : fields; for (int i = 0; i < getParamsToMerge().length; i++) { - final ParameterInfoImpl methodParam = getParameterInfo(i); + final int oldIndex = getParamsToMerge()[i].getOldIndex(); + final ParameterInfoImpl methodParam = getParameterInfo(oldIndex); final ParameterBean bean = new ParameterBean(); myExistingClassProperties.put(methodParam, bean); @@ -230,18 +231,18 @@ public class JavaIntroduceParameterObjectClassDescriptor extends IntroduceParame return compatibleConstructor; } - private boolean isConstructorCompatible(PsiMethod constructor, ParameterInfoImpl[] paramsToMerge, PsiElement context) { + private static boolean isConstructorCompatible(PsiMethod constructor, ParameterInfoImpl[] paramsToMerge, PsiElement context) { final PsiParameterList parameterList = constructor.getParameterList(); final PsiParameter[] constructorParams = parameterList.getParameters(); return areTypesCompatible(paramsToMerge, constructorParams, context); } - private boolean areTypesCompatible(ParameterInfoImpl[] expected, PsiVariable[] actual, PsiElement context) { + private static boolean areTypesCompatible(ParameterInfoImpl[] expected, PsiVariable[] actual, PsiElement context) { if (actual.length != expected.length) { return false; } for (int i = 0; i < actual.length; i++) { - if (!TypeConversionUtil.isAssignable(actual[i].getType(), getParameterInfo(i).getTypeWrapper().getType(context))) { + if (!TypeConversionUtil.isAssignable(actual[i].getType(), expected[i].getTypeWrapper().getType(context))) { return false; } } diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/after/Param.java b/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/after/Param.java new file mode 100644 index 000000000000..a45199928ab1 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/after/Param.java @@ -0,0 +1,7 @@ +public class Param { + private String s; + + public Param(String s) { + this.s = s; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/after/Test.java b/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/after/Test.java new file mode 100644 index 000000000000..5f0b19d56fde --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/after/Test.java @@ -0,0 +1,7 @@ +public class Test { + public void foo(int a, Param param) {} + + { + foo(1, new Param("")); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/before/Param.java b/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/before/Param.java new file mode 100644 index 000000000000..a45199928ab1 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/before/Param.java @@ -0,0 +1,7 @@ +public class Param { + private String s; + + public Param(String s) { + this.s = s; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/before/Test.java b/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/before/Test.java new file mode 100644 index 000000000000..71ad75b684b7 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameterObject/includeOneParameter/before/Test.java @@ -0,0 +1,7 @@ +public class Test { + public void foo(int a, String b) {} + + { + foo(1, ""); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterObjectTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterObjectTest.java index c35b9fd93c79..ed7f069e0811 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterObjectTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterObjectTest.java @@ -172,6 +172,14 @@ public class IntroduceParameterObjectTest extends MultiFileTestCase{ }); } + public void testIncludeOneParameter() throws Exception { + doTestExistingClass("Param", "", false, "public", method -> { + final PsiParameter[] parameters = method.getParameterList().getParameters(); + PsiParameter parameter = parameters[1]; + return new ParameterInfoImpl[]{new ParameterInfoImpl(1, parameter.getName(), parameter.getType())}; + }); + } + public void testTypeParametersWithChosenSubtype() throws Exception { doTest(false, true, psiMethod -> { final PsiParameter parameter = psiMethod.getParameterList().getParameters()[0]; @@ -196,6 +204,15 @@ public class IntroduceParameterObjectTest extends MultiFileTestCase{ private void doTestExistingClass(final String existingClassName, final String existingClassPackage, final boolean generateAccessors, final String newVisibility) throws Exception { + doTestExistingClass(existingClassName, existingClassPackage, generateAccessors, newVisibility, + IntroduceParameterObjectTest::generateParams); + } + + private void doTestExistingClass(final String existingClassName, + final String existingClassPackage, + final boolean generateAccessors, + final String newVisibility, + final Function function) throws Exception { doTest((rootDir, rootAfter) -> { PsiClass aClass = myJavaFacade.findClass("Test", GlobalSearchScope.projectScope(getProject())); if (aClass == null) { @@ -204,7 +221,7 @@ public class IntroduceParameterObjectTest extends MultiFileTestCase{ assertNotNull("Class Test not found", aClass); final PsiMethod method = aClass.findMethodsByName("foo", false)[0]; - final ParameterInfoImpl[] mergedParams = generateParams(method); + final ParameterInfoImpl[] mergedParams = function.fun(method); final JavaIntroduceParameterObjectClassDescriptor classDescriptor = new JavaIntroduceParameterObjectClassDescriptor(existingClassName, existingClassPackage, null, true, false, newVisibility, mergedParams, method, generateAccessors);