(no message)

This commit is contained in:
Eugene Vigdorchik
2005-03-11 15:56:22 +03:00
parent 8bb6979793
commit 540bbce86e
7 changed files with 89 additions and 37 deletions
@@ -42,7 +42,7 @@ public class GenerateEqualsWizard extends AbstractWizard {
LOG.assertTrue(needEquals || needHashCode);
myClass = aClass;
myClassFields = MemberInfo.extractClassMembers(myClass, MEMBER_INFO_FILTER);
myClassFields = MemberInfo.extractClassMembers(myClass, MEMBER_INFO_FILTER, false);
for (int i = 0; i < myClassFields.length; i++) {
myClassFields[i].setChecked(true);
}
@@ -152,7 +152,7 @@ public class GenerateEqualsWizard extends AbstractWizard {
}
private HashMap<PsiElement, MemberInfo> createFieldToMemberInfoMap(boolean checkedByDefault) {
MemberInfo[] memberInfos = MemberInfo.extractClassMembers(myClass, MEMBER_INFO_FILTER);
MemberInfo[] memberInfos = MemberInfo.extractClassMembers(myClass, MEMBER_INFO_FILTER, false);
final HashMap<PsiElement, MemberInfo> result = new HashMap<PsiElement, MemberInfo>();
for (int i = 0; i < memberInfos.length; i++) {
MemberInfo memberInfo = memberInfos[i];
@@ -73,7 +73,7 @@ class ExtractInterfaceDialog extends ExtractSuperBaseDialog {
}
return false;
}
});
}, true);
super.init();
@@ -77,7 +77,7 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra
public boolean includeMember(PsiMember element) {
return true;
}
});
}, false);
final String targetPackageName = (mySubclass.getContainingFile() instanceof PsiJavaFile)? ((PsiJavaFile) mySubclass.getContainingFile()).getPackageName() : null;
@@ -122,13 +122,11 @@ public class PullUpHelper {
} else if (info.getMember() instanceof PsiClass) {
PsiClass aClass = (PsiClass) info.getMember();
if (Boolean.FALSE.equals(info.getOverrides())) {
final PsiReferenceList sourceReferenceList;
if (!mySourceClass.isInterface()) {
sourceReferenceList = mySourceClass.getImplementsList();
} else {
sourceReferenceList = mySourceClass.getExtendsList();
}
PsiJavaCodeReferenceElement ref = RefactoringUtil.removeFromReferenceList(sourceReferenceList, aClass);
final PsiReferenceList sourceReferenceList = info.getSourceReferenceList();
LOG.assertTrue(sourceReferenceList != null);
PsiJavaCodeReferenceElement ref = mySourceClass.equals(sourceReferenceList.getParent()) ?
RefactoringUtil.removeFromReferenceList(sourceReferenceList, aClass) :
RefactoringUtil.findReferenceToClass(sourceReferenceList, aClass);
if (ref != null) {
final PsiReferenceList referenceList;
if (!myTargetSuperClass.isInterface()) {
@@ -523,14 +523,23 @@ public class RefactoringUtil {
public static PsiJavaCodeReferenceElement removeFromReferenceList(PsiReferenceList refList, PsiClass aClass)
throws IncorrectOperationException {
PsiJavaCodeReferenceElement[] refs = refList.getReferenceElements();
if (refs != null) {
for (int i = 0; i < refs.length; i++) {
PsiJavaCodeReferenceElement ref = refs[i];
if (aClass.equals(ref.resolve())) {
PsiJavaCodeReferenceElement refCopy = (PsiJavaCodeReferenceElement)ref.copy();
ref.delete();
return refCopy;
}
for (int i = 0; i < refs.length; i++) {
PsiJavaCodeReferenceElement ref = refs[i];
if (ref.isReferenceTo(aClass)) {
PsiJavaCodeReferenceElement refCopy = (PsiJavaCodeReferenceElement)ref.copy();
ref.delete();
return refCopy;
}
}
return null;
}
public static PsiJavaCodeReferenceElement findReferenceToClass(PsiReferenceList refList, PsiClass aClass) {
PsiJavaCodeReferenceElement[] refs = refList.getReferenceElements();
for (int i = 0; i < refs.length; i++) {
PsiJavaCodeReferenceElement ref = refs[i];
if (ref.isReferenceTo(aClass)) {
return ref;
}
}
return null;
@@ -11,14 +11,15 @@ package com.intellij.refactoring.util.classMembers;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.psi.util.PsiSuperMethodUtil;
import com.intellij.util.containers.HashSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class MemberInfo {
private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.extractSuperclass.MemberInfo");
private PsiMember member;
private PsiMember myMember;
final private boolean isStatic;
final private String displayName;
private boolean isChecked = false;
@@ -27,6 +28,7 @@ public class MemberInfo {
* TRUE if is overriden, FALSE if implemented, null if not implemented or overriden
*/
final private Boolean overrides;
private final PsiReferenceList mySourceReferenceList;
public boolean isStatic() {
return isStatic;
@@ -64,18 +66,19 @@ public class MemberInfo {
}
public MemberInfo(PsiMember member) {
this(member, false);
this(member, false, null);
}
public MemberInfo(PsiMember member, boolean isSuperClass) {
public MemberInfo(PsiMember member, boolean isSuperClass, PsiReferenceList sourceReferenceList) {
LOG.assertTrue(member.isValid());
this.member = member;
myMember = member;
mySourceReferenceList = sourceReferenceList;
if (member instanceof PsiMethod) {
PsiMethod method = (PsiMethod) member;
displayName = PsiFormatUtil.formatMethod(method,
PsiSubstitutor.EMPTY, PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_TYPE | PsiFormatUtil.TYPE_AFTER | PsiFormatUtil.SHOW_PARAMETERS,
PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_TYPE | PsiFormatUtil.TYPE_AFTER
);
PsiMethod[] superMethods = PsiSuperMethodUtil.findSuperMethods(method);
PsiMethod[] superMethods = method.findSuperMethods();
if (superMethods.length > 0) {
overrides = !superMethods[0].hasModifierProperty(PsiModifier.ABSTRACT) ? Boolean.TRUE : Boolean.FALSE;
}
@@ -121,8 +124,8 @@ public class MemberInfo {
}
public PsiMember getMember() {
LOG.assertTrue(member.isValid());
return member;
LOG.assertTrue(myMember.isValid());
return myMember;
}
/**
@@ -130,26 +133,35 @@ public class MemberInfo {
* @param element
*/
public void updateMember(PsiMember element) {
member = element;
myMember = element;
}
public PsiReferenceList getSourceReferenceList() {
return mySourceReferenceList;
}
public static interface Filter {
boolean includeMember(PsiMember member);
}
public static MemberInfo[] extractClassMembers(PsiClass subclass, Filter filter) {
public static MemberInfo[] extractClassMembers(PsiClass subclass, Filter filter, boolean extractInterfacesDeep) {
List<MemberInfo> members = new ArrayList<MemberInfo>();
extractClassMembers(subclass, members, filter);
extractClassMembers(subclass, members, filter, extractInterfacesDeep);
return members.toArray(new MemberInfo[members.size()]);
}
public static void extractClassMembers(PsiClass subclass, List<MemberInfo> result, Filter filter) {
PsiClass[] interfaces = subclass.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
PsiClass anInterface = interfaces[i];
if (filter.includeMember(anInterface)) {
result.add(new MemberInfo(anInterface, true));
public static void extractClassMembers(PsiClass subclass, List<MemberInfo> result, Filter filter, final boolean extractInterfacesDeep) {
if (extractInterfacesDeep) {
extractSuperInterfaces(subclass, filter, result, new HashSet<PsiClass>());
}
else {
PsiClass[] interfaces = subclass.getInterfaces();
PsiReferenceList sourceRefList = subclass.isInterface() ? subclass.getExtendsList() : subclass.getImplementsList();
for (int i = 0; i < interfaces.length; i++) {
PsiClass anInterface = interfaces[i];
if (filter.includeMember(anInterface)) {
result.add(new MemberInfo(anInterface, true, sourceRefList));
}
}
}
@@ -174,4 +186,37 @@ public class MemberInfo {
}
}
}
private static void extractSuperInterfaces(final PsiClass subclass,
final Filter filter,
final List<MemberInfo> result,
Set<PsiClass> processed) {
if (!processed.contains(subclass)) {
processed.add(subclass);
extractSuperInterfacesFromReferenceList(subclass.getExtendsList(), filter, result, processed);
extractSuperInterfacesFromReferenceList(subclass.getImplementsList(), filter, result, processed);
}
}
private static void extractSuperInterfacesFromReferenceList(final PsiReferenceList referenceList,
final Filter filter,
final List<MemberInfo> result,
final Set<PsiClass> processed) {
if (referenceList != null) {
final PsiClassType[] extendsListTypes = referenceList.getReferencedTypes();
for (int i = 0; i < extendsListTypes.length; i++) {
final PsiClass aSuper = extendsListTypes[i].resolve();
if (aSuper != null) {
if (aSuper.isInterface()) {
if (filter.includeMember(aSuper)) {
result.add(new MemberInfo(aSuper, true, referenceList));
}
}
else {
extractSuperInterfaces(aSuper, filter, result, processed);
}
}
}
}
}
}
@@ -49,7 +49,7 @@ public class MemberInfoStorage {
List<MemberInfo> result = myClassToMemberInfoMap.get(aClass);
if(result == null) {
ArrayList<MemberInfo> temp = new ArrayList<MemberInfo>();
MemberInfo.extractClassMembers(aClass, temp, myFilter);
MemberInfo.extractClassMembers(aClass, temp, myFilter, false);
result = Collections.unmodifiableList(temp);
myClassToMemberInfoMap.put(aClass, result);
}