From 9aa9935bf88c6a26daa2442ce0e09b2ff6602dd9 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 12 Feb 2010 18:10:30 +0300 Subject: [PATCH] encapsulate fields: javadoc placement settings (IDEA-52195) --- .../EncapsulateFieldsDescriptor.java | 2 ++ .../encapsulateFields/EncapsulateFieldsDialog.java | 31 ++++++++++++++-------- .../EncapsulateFieldsProcessor.java | 18 +++++++++++-- .../moveJavadocToGetter/after/Test.java | 21 +++++++++++++++ .../moveJavadocToGetter/before/Test.java | 13 +++++++++ .../refactoring/EncapsulateFieldsTest.java | 17 ++++++++++++ 6 files changed, 89 insertions(+), 13 deletions(-) create mode 100644 java/java-tests/testData/refactoring/encapsulateFields/moveJavadocToGetter/after/Test.java create mode 100644 java/java-tests/testData/refactoring/encapsulateFields/moveJavadocToGetter/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDescriptor.java b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDescriptor.java index 3fe056c26c..edd0e3a9fa 100644 --- a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDescriptor.java +++ b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDescriptor.java @@ -49,4 +49,6 @@ public interface EncapsulateFieldsDescriptor { @Modifier String getAccessorsVisibility(); + + int getJavadocPolicy(); } diff --git a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDialog.java b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDialog.java index 4431cb52ce..d3fd0e5d3a 100644 --- a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDialog.java @@ -26,6 +26,7 @@ import com.intellij.psi.util.PsiFormatUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.JavaRefactoringSettings; +import com.intellij.refactoring.ui.DocCommentPanel; import com.intellij.refactoring.ui.RefactoringDialog; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.RefactoringMessageUtil; @@ -84,6 +85,7 @@ public class EncapsulateFieldsDialog extends RefactoringDialog implements Encaps private final JRadioButton myRbAccessorPrivate = new JRadioButton(); private final JRadioButton myRbAccessorPackageLocal = new JRadioButton(); private static final String REFACTORING_NAME = RefactoringBundle.message("encapsulate.fields.title"); + private DocCommentPanel myJavadocPolicy; { myCbEncapsulateGet.setFocusable(false); @@ -224,6 +226,10 @@ public class EncapsulateFieldsDialog extends RefactoringDialog implements Encaps } } + public int getJavadocPolicy() { + return myJavadocPolicy.getPolicy(); + } + protected String getDimensionServiceKey() { return "#com.intellij.refactoring.encapsulateFields.EncalpsulateFieldsDialog"; } @@ -310,22 +316,25 @@ public String getAccessorsVisibility() { myCbEncapsulateGet.setPreferredSize(myCbUseAccessorsWhenAccessible.getPreferredSize()); leftBox.add(myCbEncapsulateGet); leftBox.add(myCbEncapsulateSet); + leftBox.add(Box.createVerticalStrut(10)); + leftBox.add(myCbUseAccessorsWhenAccessible); JPanel leftPanel = new JPanel(new BorderLayout()); leftPanel.setBorder(IdeBorderFactory.createTitledBorder(RefactoringBundle.message("encapsulate.fields.encapsulate.border.title"))); leftPanel.add(leftBox, BorderLayout.CENTER); leftPanel.add(Box.createHorizontalStrut(5), BorderLayout.WEST); - Box rightBox = Box.createVerticalBox(); - rightBox.add(myCbUseAccessorsWhenAccessible); - JPanel rightPanel = new JPanel(new BorderLayout()); - rightPanel.setBorder(IdeBorderFactory.createTitledBorder(RefactoringBundle.message("encapsulate.fields.options.border.title"))); - rightPanel.add(rightBox, BorderLayout.CENTER); - rightPanel.add(Box.createHorizontalStrut(5), BorderLayout.WEST); - - Box encapsulateBox = Box.createHorizontalBox(); - encapsulateBox.add(leftPanel); - encapsulateBox.add(Box.createHorizontalStrut(5)); - encapsulateBox.add(rightPanel); + JPanel encapsulateBox = new JPanel(new BorderLayout()); + encapsulateBox.add(leftPanel, BorderLayout.CENTER); + myJavadocPolicy = new DocCommentPanel("JavaDoc"); + encapsulateBox.add(myJavadocPolicy, BorderLayout.EAST); + boolean hasJavadoc = false; + for (PsiField field : myFields) { + if (field.getDocComment() != null) { + hasJavadoc = true; + break; + } + } + myJavadocPolicy.setVisible(hasJavadoc); Box fieldsBox = Box.createVerticalBox(); fieldsBox.add(myRbFieldPrivate); diff --git a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsProcessor.java b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsProcessor.java index 10fc740ad5..b2d86624a0 100644 --- a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsProcessor.java @@ -22,6 +22,7 @@ import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.tree.IElementType; @@ -32,6 +33,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.RefactoringUIUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; @@ -256,17 +258,27 @@ public class EncapsulateFieldsProcessor extends BaseRefactoringProcessor { myNameToGetter = new HashMap(); myNameToSetter = new HashMap(); for(int i = 0; i < myFields.length; i++){ + final DocCommentPolicy commentPolicy = new DocCommentPolicy(myDescriptor.getJavadocPolicy()); PsiField field = myFields[i]; + final PsiDocComment docComment = field.getDocComment(); if (myDescriptor.isToEncapsulateGet()){ PsiMethod[] prototypes = myDescriptor.getGetterPrototypes(); assert prototypes != null; - addOrChangeAccessor(prototypes[i], myNameToGetter); + final PsiMethod getter = addOrChangeAccessor(prototypes[i], myNameToGetter); + if (docComment != null) { + final PsiDocComment getterJavadoc = (PsiDocComment)getter.addBefore(docComment, getter.getFirstChild()); + commentPolicy.processNewJavaDoc(getterJavadoc); + } } if (myDescriptor.isToEncapsulateSet() && !field.hasModifierProperty(PsiModifier.FINAL)){ PsiMethod[] prototypes = myDescriptor.getSetterPrototypes(); assert prototypes != null; addOrChangeAccessor(prototypes[i], myNameToSetter); } + + if (docComment != null) { + commentPolicy.processOldJavaDoc(docComment); + } } Map> usagesInFiles = new HashMap>(); @@ -305,7 +317,7 @@ public class EncapsulateFieldsProcessor extends BaseRefactoringProcessor { } } - private void addOrChangeAccessor(PsiMethod prototype, HashMap nameToAncestor) { + private PsiMethod addOrChangeAccessor(PsiMethod prototype, HashMap nameToAncestor) { PsiMethod existing = myClass.findMethodBySignature(prototype, false); PsiMethod result = existing; try{ @@ -317,10 +329,12 @@ public class EncapsulateFieldsProcessor extends BaseRefactoringProcessor { //TODO : change visibility } nameToAncestor.put(prototype.getName(), result); + return result; } catch(IncorrectOperationException e){ LOG.error(e); } + return null; } private boolean isUsedInExistingAccessor(PsiMethod prototype, PsiElement element) { diff --git a/java/java-tests/testData/refactoring/encapsulateFields/moveJavadocToGetter/after/Test.java b/java/java-tests/testData/refactoring/encapsulateFields/moveJavadocToGetter/after/Test.java new file mode 100644 index 0000000000..ca5018890c --- /dev/null +++ b/java/java-tests/testData/refactoring/encapsulateFields/moveJavadocToGetter/after/Test.java @@ -0,0 +1,21 @@ +public class A { + public int i; + + + public static void main(String[] args) { + A a = new B(); + a.setI(23); + System.out.println(a.getI()); + } + + /** + * my javadoc for field + */ + public int getI() { + return i; + } + + public void setI(int i) { + this.i = i; + } +} diff --git a/java/java-tests/testData/refactoring/encapsulateFields/moveJavadocToGetter/before/Test.java b/java/java-tests/testData/refactoring/encapsulateFields/moveJavadocToGetter/before/Test.java new file mode 100644 index 0000000000..5a634518bb --- /dev/null +++ b/java/java-tests/testData/refactoring/encapsulateFields/moveJavadocToGetter/before/Test.java @@ -0,0 +1,13 @@ +public class A { + /** + * my javadoc for field + */ + public int i; + + + public static void main(String[] args) { + A a = new B(); + a.i = 23; + System.out.println(a.i); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java index be800015bd..45e6a73252 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java @@ -14,6 +14,7 @@ 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.util.DocCommentPolicy; import junit.framework.Assert; import org.jetbrains.annotations.Nullable; @@ -38,6 +39,18 @@ public class EncapsulateFieldsTest extends MultiFileTestCase{ doTest("i", "A.B", "There is already a method A.getI() which would be hidden by generated getter"); } + public void testMoveJavadocToGetter() throws Exception { + doTest(new PerformAction() { + public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception { + final PsiClass aClass = myJavaFacade.findClass("A", GlobalSearchScope.projectScope(myProject)); + assertNotNull("Tested class not found", aClass); + final PsiField field = aClass.findFieldByName("i", false); + assertNotNull(field); + doTest(aClass, field, null, true, true); + } + }); + } + @Override protected String getTestDataPath() { return JavaTestUtil.getJavaTestDataPath(); @@ -115,6 +128,10 @@ public class EncapsulateFieldsTest extends MultiFileTestCase{ public String getAccessorsVisibility() { return PsiModifier.PUBLIC; } + + public int getJavadocPolicy() { + return DocCommentPolicy.MOVE; + } }); processor.run(); LocalFileSystem.getInstance().refresh(false); -- 2.11.4.GIT