respect javadoc policy for inlined members on inline super class as well as push down with existing members (IDEA-67580)

This commit is contained in:
anna
2011-04-12 20:57:36 +02:00
parent ee7734a710
commit cb836b3251
5 changed files with 49 additions and 11 deletions
@@ -23,7 +23,10 @@ package com.intellij.refactoring.inlineSuperClass;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiClass;
import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.ui.DocCommentPanel;
import com.intellij.refactoring.ui.RefactoringDialog;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
@@ -32,24 +35,39 @@ import javax.swing.*;
public class InlineSuperClassRefactoringDialog extends RefactoringDialog{
private final PsiClass mySuperClass;
private final PsiClass[] myTargetClasses;
private final DocCommentPanel myDocPanel;
protected InlineSuperClassRefactoringDialog(@NotNull Project project, PsiClass superClass, final PsiClass... targetClasses) {
super(project, false);
mySuperClass = superClass;
myTargetClasses = targetClasses;
myDocPanel = new DocCommentPanel("JavaDoc for inlined members");
myDocPanel.setPolicy(JavaRefactoringSettings.getInstance().PULL_UP_MEMBERS_JAVADOC);
init();
setTitle(InlineSuperClassRefactoringHandler.REFACTORING_NAME);
}
protected void doAction() {
invokeRefactoring(new InlineSuperClassRefactoringProcessor(getProject(), mySuperClass, myTargetClasses));
invokeRefactoring(new InlineSuperClassRefactoringProcessor(getProject(), mySuperClass, myDocPanel.getPolicy(), myTargetClasses));
}
@Override
protected JComponent createNorthPanel() {
return myDocPanel;
}
protected JComponent createCenterPanel() {
return new JLabel("<html>Inline \'" + mySuperClass.getQualifiedName() + "\' to <br>&nbsp;&nbsp;&nbsp;\'" + StringUtil.join(myTargetClasses, new Function<PsiClass, String>() {
public String fun(final PsiClass psiClass) {
return psiClass.getQualifiedName();
}
}, "\',<br>&nbsp;&nbsp;&nbsp;\'") + "\'</html>");
final JLabel label = new JLabel("<html>Inline \'" +
mySuperClass.getQualifiedName() +
"\' to " +
(myTargetClasses.length > 1 ? " <br>&nbsp;&nbsp;&nbsp;\'" : "\'") +
StringUtil.join(myTargetClasses, new Function<PsiClass, String>() {
public String fun(final PsiClass psiClass) {
return psiClass.getQualifiedName();
}
}, "\',<br>&nbsp;&nbsp;&nbsp;\'") +
"\'</html>");
label.setBorder(IdeBorderFactory.createEmptyBorder(5, 5, 5, 5));
return label;
}
}
@@ -51,12 +51,14 @@ public class InlineSuperClassRefactoringProcessor extends FixableUsagesRefactori
public static final Logger LOG = Logger.getInstance("#" + InlineSuperClassRefactoringProcessor.class.getName());
private final PsiClass mySuperClass;
private final int myPolicy;
private final PsiClass[] myTargetClasses;
private final MemberInfo[] myMemberInfos;
public InlineSuperClassRefactoringProcessor(Project project, PsiClass superClass, final PsiClass... targetClasses) {
public InlineSuperClassRefactoringProcessor(Project project, PsiClass superClass, int policy, final PsiClass... targetClasses) {
super(project);
mySuperClass = superClass;
myPolicy = policy;
myTargetClasses = targetClasses;
MemberInfoStorage memberInfoStorage = new MemberInfoStorage(mySuperClass, new MemberInfo.Filter<PsiMember>() {
public boolean includeMember(PsiMember element) {
@@ -205,7 +207,7 @@ public class InlineSuperClassRefactoringProcessor extends FixableUsagesRefactori
}
protected void performRefactoring(final UsageInfo[] usages) {
new PushDownProcessor(mySuperClass.getProject(), myMemberInfos, mySuperClass, new DocCommentPolicy(DocCommentPolicy.ASIS)){
new PushDownProcessor(mySuperClass.getProject(), myMemberInfos, mySuperClass, new DocCommentPolicy(myPolicy)){
//push down conflicts are already collected
@Override
protected boolean showConflicts(MultiMap<PsiElement, String> conflicts, UsageInfo[] usages) {
@@ -26,7 +26,9 @@ import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.impl.source.codeStyle.JavaCodeStyleManagerImpl;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PsiTreeUtil;
@@ -368,6 +370,17 @@ public class PushDownProcessor extends BaseRefactoringProcessor {
if (annotation != null) {
annotation.delete();
}
final PsiDocComment oldDocComment = method.getDocComment();
if (oldDocComment != null) {
final PsiDocComment docComment = methodBySignature.getDocComment();
if (myJavaDocPolicy.getJavaDocPolicy() == DocCommentPolicy.COPY || myJavaDocPolicy.getJavaDocPolicy() == DocCommentPolicy.MOVE) {
if (docComment != null) {
docComment.replace(oldDocComment);
} else {
methodBySignature.getParent().addBefore(oldDocComment, methodBySignature);
}
}
}
}
}
else if (member instanceof PsiClass) {
@@ -392,7 +405,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor {
}
});
for (PsiReference psiReference : refsToRebind) {
JavaCodeStyleManagerImpl.getInstance(myProject).shortenClassReferences(psiReference.bindToElement(newMember));
JavaCodeStyleManager.getInstance(myProject).shortenClassReferences(psiReference.bindToElement(newMember));
}
final JavaRefactoringListenerManager listenerManager = JavaRefactoringListenerManager.getInstance(newMember.getProject());
((JavaRefactoringListenerManagerImpl)listenerManager).fireMemberMoved(myClass, newMember);