From ce07f3646dbf11c2b2bb8c2a9d9cc1b30404ac9b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 11 Jun 2015 22:23:16 +0300 Subject: [PATCH] disable field encapsulation for enum constants (IDEA-141305) --- .../EncapsulateFieldsHandler.java | 17 +++++--- .../JavaEncapsulateFieldHelper.java | 12 +++++- .../filterEnumConstants/after/Test.java | 12 ++++++ .../filterEnumConstants/before/Test.java | 4 ++ .../refactoring/EncapsulateFieldsTest.java | 41 +++++++++++-------- 5 files changed, 62 insertions(+), 24 deletions(-) create mode 100644 java/java-tests/testData/refactoring/encapsulateFields/filterEnumConstants/after/Test.java create mode 100644 java/java-tests/testData/refactoring/encapsulateFields/filterEnumConstants/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsHandler.java b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsHandler.java index b4b26c1ccc3f..e453744c4f86 100644 --- a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsHandler.java @@ -22,17 +22,17 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiFile; +import com.intellij.openapi.util.Condition; +import com.intellij.psi.*; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.HashSet; +import java.util.List; public class EncapsulateFieldsHandler implements RefactoringActionHandler { private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.encapsulateFields.EncapsulateFieldsHandler"); @@ -108,8 +108,13 @@ public class EncapsulateFieldsHandler implements RefactoringActionHandler { } LOG.assertTrue(aClass != null); - final PsiField[] fields = aClass.getFields(); - if (fields.length == 0) { + final List fields = ContainerUtil.filter(aClass.getFields(), new Condition() { + @Override + public boolean value(PsiField field) { + return !(field instanceof PsiEnumConstant); + } + }); + if (fields.isEmpty()) { CommonRefactoringUtil.showErrorHint(project, CommonDataKeys.EDITOR.getData(dataContext), "Class has no fields to encapsulate", REFACTORING_NAME, HelpID.ENCAPSULATE_FIELDS); return; diff --git a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/JavaEncapsulateFieldHelper.java b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/JavaEncapsulateFieldHelper.java index 1430a4b98fb7..972824d18d62 100644 --- a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/JavaEncapsulateFieldHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/JavaEncapsulateFieldHelper.java @@ -17,6 +17,7 @@ package com.intellij.refactoring.encapsulateFields; import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; @@ -25,10 +26,13 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * @author Max Medvedev */ @@ -307,7 +311,13 @@ public class JavaEncapsulateFieldHelper extends EncapsulateFieldHelper { @NotNull @Override public PsiField[] getApplicableFields(@NotNull PsiClass aClass) { - return aClass.getFields(); + final List fields = ContainerUtil.filter(aClass.getFields(), new Condition() { + @Override + public boolean value(PsiField field) { + return !(field instanceof PsiEnumConstant); + } + }); + return fields.toArray(new PsiField[fields.size()]); } @Override diff --git a/java/java-tests/testData/refactoring/encapsulateFields/filterEnumConstants/after/Test.java b/java/java-tests/testData/refactoring/encapsulateFields/filterEnumConstants/after/Test.java new file mode 100644 index 000000000000..f6d508b6a552 --- /dev/null +++ b/java/java-tests/testData/refactoring/encapsulateFields/filterEnumConstants/after/Test.java @@ -0,0 +1,12 @@ +enum A { + B; + private int i; + + public int getI() { + return i; + } + + public void setI(int i) { + this.i = i; + } +} diff --git a/java/java-tests/testData/refactoring/encapsulateFields/filterEnumConstants/before/Test.java b/java/java-tests/testData/refactoring/encapsulateFields/filterEnumConstants/before/Test.java new file mode 100644 index 000000000000..0b36fa5f5bbd --- /dev/null +++ b/java/java-tests/testData/refactoring/encapsulateFields/filterEnumConstants/before/Test.java @@ -0,0 +1,4 @@ +enum A { + B; + private int i; +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java index 329ab69e9d1d..e8634380782b 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java @@ -25,16 +25,11 @@ import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; import com.intellij.psi.PsiModifier; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PropertyUtil; -import com.intellij.refactoring.encapsulateFields.EncapsulateFieldsDescriptor; -import com.intellij.refactoring.encapsulateFields.EncapsulateFieldsProcessor; -import com.intellij.refactoring.encapsulateFields.FieldDescriptor; -import com.intellij.refactoring.encapsulateFields.FieldDescriptorImpl; +import com.intellij.refactoring.encapsulateFields.*; import com.intellij.refactoring.util.DocCommentPolicy; import junit.framework.Assert; import org.jetbrains.annotations.NotNull; @@ -82,7 +77,15 @@ public class EncapsulateFieldsTest extends MultiFileTestCase{ assertNotNull("Tested class not found", aClass); final PsiField field = aClass.findFieldByName("i", false); assertNotNull(field); - doTest(aClass, field, null, true, true); + doTest(aClass, null, true, true, field); + }); + } + + public void testFilterEnumConstants() throws Exception { + doTest((rootDir, rootAfter) -> { + final PsiClass aClass = myJavaFacade.findClass("A", GlobalSearchScope.projectScope(myProject)); + assertNotNull("Tested class not found", aClass); + doTest(aClass, null, true, true, new JavaEncapsulateFieldHelper().getApplicableFields(aClass)); }); } @@ -109,28 +112,32 @@ public class EncapsulateFieldsTest extends MultiFileTestCase{ assertNotNull("Tested class not found", aClass); - doTest(aClass, aClass.findFieldByName(fieldName, false), conflicts, true, true); + doTest(aClass, conflicts, true, true, aClass.findFieldByName(fieldName, false)); }); } private static void doTest(final PsiClass aClass, - final PsiField field, final String conflicts, final boolean generateGetters, - final boolean generateSetters) { + final boolean generateSetters, + final PsiField... fields) { try { final Project project = aClass.getProject(); EncapsulateFieldsProcessor processor = new EncapsulateFieldsProcessor(project, new EncapsulateFieldsDescriptor() { @Override public FieldDescriptor[] getSelectedFields() { - return new FieldDescriptor[]{new FieldDescriptorImpl( - field, - GenerateMembersUtil.suggestGetterName(field), - GenerateMembersUtil.suggestSetterName(field), - isToEncapsulateGet() ? GenerateMembersUtil.generateGetterPrototype(field) : null, - isToEncapsulateSet() ? GenerateMembersUtil.generateSetterPrototype(field) : null - )}; + final FieldDescriptor[] descriptors = new FieldDescriptor[fields.length]; + for (int i = 0; i < fields.length; i++) { + descriptors[i] = new FieldDescriptorImpl( + fields[i], + GenerateMembersUtil.suggestGetterName(fields[i]), + GenerateMembersUtil.suggestSetterName(fields[i]), + isToEncapsulateGet() ? GenerateMembersUtil.generateGetterPrototype(fields[i]) : null, + isToEncapsulateSet() ? GenerateMembersUtil.generateSetterPrototype(fields[i]) : null + ); + } + return descriptors; } @Override