diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java index a3c5b5c68a15..116da27861d4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java @@ -134,6 +134,32 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase { return members; } + @Override + protected MemberChooser createMembersChooser(ClassMember[] members, + boolean allowEmptySelection, + boolean copyJavadocCheckbox, + Project project) { + final MemberChooser chooser = super.createMembersChooser(members, allowEmptySelection, copyJavadocCheckbox, project); + final List preselection = preselect(members); + if (!preselection.isEmpty()) { + chooser.selectElements(preselection.toArray(new ClassMember[preselection.size()])); + } + return chooser; + } + + protected static List preselect(ClassMember[] members) { + final List preselection = new ArrayList(); + for (ClassMember member : members) { + if (member instanceof PsiFieldMember) { + final PsiField psiField = ((PsiFieldMember)member).getElement(); + if (psiField != null && psiField.hasModifierProperty(PsiModifier.FINAL)) { + preselection.add(member); + } + } + } + return preselection; + } + @NotNull protected List generateMemberPrototypes(PsiClass aClass, ClassMember[] members) throws IncorrectOperationException { List baseConstructors = new ArrayList(); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java index 79cbfe47eef0..a42018e62eb8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java @@ -183,15 +183,23 @@ public abstract class GenerateMembersHandlerBase implements CodeInsightActionHan @Nullable protected ClassMember[] chooseMembers(ClassMember[] members, boolean allowEmptySelection, boolean copyJavadocCheckbox, Project project) { - MemberChooser chooser = new MemberChooser(members, allowEmptySelection, true, project); - chooser.setTitle(myChooserTitle); - chooser.setCopyJavadocVisible(copyJavadocCheckbox); + MemberChooser chooser = createMembersChooser(members, allowEmptySelection, copyJavadocCheckbox, project); chooser.show(); myToCopyJavaDoc = chooser.isCopyJavadoc(); final List list = chooser.getSelectedElements(); return list == null ? null : list.toArray(new ClassMember[list.size()]); } + protected MemberChooser createMembersChooser(ClassMember[] members, + boolean allowEmptySelection, + boolean copyJavadocCheckbox, + Project project) { + MemberChooser chooser = new MemberChooser(members, allowEmptySelection, true, project); + chooser.setTitle(myChooserTitle); + chooser.setCopyJavadocVisible(copyJavadocCheckbox); + return chooser; + } + @NotNull protected List generateMemberPrototypes(PsiClass aClass, ClassMember[] members) throws IncorrectOperationException { ArrayList array = new ArrayList(); diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java b/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java new file mode 100644 index 000000000000..bd402a9b28b7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java @@ -0,0 +1,11 @@ +class Test { + private int a; + private final int b; + private int c; + private final int d; + + Test(int b, int d) { + this.b = b; + this.d = d; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/generateConstructor/beforeFinalFieldPreselection.java b/java/java-tests/testData/codeInsight/generateConstructor/beforeFinalFieldPreselection.java new file mode 100644 index 000000000000..57459a5e4b37 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateConstructor/beforeFinalFieldPreselection.java @@ -0,0 +1,6 @@ +class Test { + private int a; + private final int b; + private int c; + private final int d; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateConstructorTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateConstructorTest.java index 21efe1f59f4a..c04ab6a28d4c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateConstructorTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateConstructorTest.java @@ -10,6 +10,8 @@ import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.testFramework.LightCodeInsightTestCase; +import java.util.List; + public class GenerateConstructorTest extends LightCodeInsightTestCase { public void testAbstractClass() throws Exception { doTest(); } public void testPackageLocalClass() throws Exception { doTest(); } @@ -38,6 +40,22 @@ public class GenerateConstructorTest extends LightCodeInsightTestCase { doTest(); } + public void testFinalFieldPreselection() throws Exception { + String name = getTestName(false); + configureByFile("/codeInsight/generateConstructor/before" + name + ".java"); + new GenerateConstructorHandler() { + @Override + protected ClassMember[] chooseMembers(ClassMember[] members, + boolean allowEmptySelection, + boolean copyJavadocCheckbox, + Project project) { + final List preselection = GenerateConstructorHandler.preselect(members); + return preselection.toArray(new ClassMember[preselection.size()]); + } + }.invoke(getProject(), getEditor(), getFile()); + checkResultByFile("/codeInsight/generateConstructor/after" + name +".java"); + } + private void doTest() throws Exception { String name = getTestName(false); configureByFile("/codeInsight/generateConstructor/before" +