class members refactoring refactoring
[fedora-idea.git] / refactoring / impl / com / intellij / refactoring / util / classMembers / InterfaceMemberDependencyGraph.java
blob84020947807d9733973533d4ba0dde251ba3e588
1 package com.intellij.refactoring.util.classMembers;
3 import com.intellij.psi.*;
4 import com.intellij.refactoring.RefactoringBundle;
5 import com.intellij.refactoring.classMembers.MemberDependencyGraph;
6 import com.intellij.util.containers.HashMap;
8 import java.util.HashSet;
9 import java.util.Iterator;
10 import java.util.Set;
12 public class InterfaceMemberDependencyGraph implements MemberDependencyGraph<PsiMember, MemberInfo> {
13 protected HashSet<PsiMethod> myInterfaceDependencies = null;
14 protected HashMap<PsiMethod,HashSet<PsiClass>> myMembersToInterfacesMap = new HashMap<PsiMethod, HashSet<PsiClass>>();
15 protected HashSet<PsiClass> myImplementedInterfaces;
16 protected HashMap<PsiClass,HashSet<PsiMethod>> myMethodsFromInterfaces;
17 protected PsiClass myClass;
19 public InterfaceMemberDependencyGraph(PsiClass aClass) {
20 myClass = aClass;
21 myImplementedInterfaces = new HashSet<PsiClass>();
22 myMethodsFromInterfaces = new com.intellij.util.containers.HashMap<PsiClass, HashSet<PsiMethod>>();
25 public void memberChanged(MemberInfo memberInfo) {
26 if (ClassMembersUtil.isImplementedInterface(memberInfo)) {
27 final PsiClass aClass = (PsiClass) memberInfo.getMember();
28 myInterfaceDependencies = null;
29 myMembersToInterfacesMap = null;
30 if(memberInfo.isChecked()) {
31 myImplementedInterfaces.add(aClass);
33 else {
34 myImplementedInterfaces.remove(aClass);
39 public Set<? extends PsiMember> getDependent() {
40 if(myInterfaceDependencies == null) {
41 myInterfaceDependencies = new HashSet<PsiMethod>();
42 myMembersToInterfacesMap = new com.intellij.util.containers.HashMap<PsiMethod, HashSet<PsiClass>>();
43 for (final PsiClass implementedInterface : myImplementedInterfaces) {
44 addInterfaceDeps(implementedInterface);
47 return myInterfaceDependencies;
50 public Set<? extends PsiMember> getDependenciesOf(PsiMember member) {
51 final Set dependent = getDependent();
52 if(dependent.contains(member)) return myMembersToInterfacesMap.get(member);
53 return null;
56 public String getElementTooltip(PsiMember member) {
57 final Set<? extends PsiMember> dependencies = getDependenciesOf(member);
58 if(dependencies == null || dependencies.size() == 0) return null;
59 StringBuffer buffer = new StringBuffer();
60 buffer.append(RefactoringBundle.message("interface.member.dependency.required.by.interfaces", dependencies.size()));
62 for (Iterator<? extends PsiMember> iterator = dependencies.iterator(); iterator.hasNext();) {
63 PsiClass aClass = (PsiClass) iterator.next();
64 buffer.append(aClass.getName());
65 if(iterator.hasNext()) {
66 buffer.append(", ");
69 return buffer.toString();
72 protected void addInterfaceDeps(PsiClass intf) {
73 HashSet<PsiMethod> interfaceMethods = myMethodsFromInterfaces.get(intf);
75 if(interfaceMethods == null) {
76 interfaceMethods = new HashSet<PsiMethod>();
77 buildInterfaceMethods(interfaceMethods, intf);
78 myMethodsFromInterfaces.put(intf, interfaceMethods);
80 for (PsiMethod method : interfaceMethods) {
81 HashSet<PsiClass> interfaces = myMembersToInterfacesMap.get(method);
82 if (interfaces == null) {
83 interfaces = new HashSet<PsiClass>();
84 myMembersToInterfacesMap.put(method, interfaces);
86 interfaces.add(intf);
88 myInterfaceDependencies.addAll(interfaceMethods);
91 private void buildInterfaceMethods(HashSet<PsiMethod> interfaceMethods, PsiClass intf) {
92 PsiMethod[] methods = intf.getMethods();
93 for (PsiMethod method1 : methods) {
94 PsiMethod method = myClass.findMethodBySignature(method1, true);
95 if (method != null) {
96 interfaceMethods.add(method);
100 PsiReferenceList implementsList = intf.getImplementsList();
101 if (implementsList != null) {
102 PsiClassType[] implemented = implementsList.getReferencedTypes();
103 for (PsiClassType aImplemented : implemented) {
104 PsiClass resolved = aImplemented.resolve();
105 if (resolved != null) {
106 buildInterfaceMethods(interfaceMethods, resolved);
111 PsiReferenceList extendsList = intf.getExtendsList();
112 if (extendsList != null) {
113 PsiClassType[] extended = extendsList.getReferencedTypes();
114 for (PsiClassType aExtended : extended) {
115 PsiClass ref = aExtended.resolve();
116 if (ref != null) {
117 buildInterfaceMethods(interfaceMethods, ref);