class members refactoring refactoring
[fedora-idea.git] / lang-impl / src / com / intellij / refactoring / classMembers / UsedByMemberDependencyGraph.java
blobc7b5e3d1dfaf3f7b619b04c5662ccbc1dc40f44e
1 package com.intellij.refactoring.classMembers;
3 import com.intellij.lang.LanguageDependentMembersRefactoringSupport;
4 import com.intellij.openapi.util.text.StringUtil;
5 import com.intellij.psi.NavigatablePsiElement;
6 import com.intellij.psi.PsiNamedElement;
7 import com.intellij.psi.PsiElement;
8 import com.intellij.refactoring.RefactoringBundle;
9 import com.intellij.util.containers.HashMap;
11 import java.util.ArrayList;
12 import java.util.HashSet;
13 import java.util.Set;
15 public class UsedByMemberDependencyGraph<T extends NavigatablePsiElement, C extends PsiElement, M extends MemberInfoBase<T>> implements MemberDependencyGraph<T, M> {
16 protected HashSet<T> mySelectedNormal;
17 protected HashSet<T> mySelectedAbstract;
18 protected HashSet<T> myMembers;
19 protected HashSet<T> myDependencies = null;
20 protected HashMap<T, HashSet<T>> myDependenciesToDependent = null;
21 private final MemberDependenciesStorage<T, C> myMemberDependenciesStorage;
23 UsedByMemberDependencyGraph(C aClass) {
24 myMemberDependenciesStorage = new MemberDependenciesStorage<T, C>(aClass, null);
25 mySelectedNormal = new HashSet<T>();
26 mySelectedAbstract = new HashSet<T>();
27 myMembers = new HashSet<T>();
30 public void memberChanged(M memberInfo) {
31 final ClassMembersRefactoringSupport support =
32 LanguageDependentMembersRefactoringSupport.INSTANCE.forLanguage(memberInfo.getMember().getLanguage());
33 if (support != null && support.isProperMember(memberInfo)) {
34 myDependencies = null;
35 myDependenciesToDependent = null;
36 T member = memberInfo.getMember();
37 myMembers.add(member);
38 if (!memberInfo.isChecked()) {
39 mySelectedNormal.remove(member);
40 mySelectedAbstract.remove(member);
42 else {
43 if (memberInfo.isToAbstract()) {
44 mySelectedNormal.remove(member);
45 mySelectedAbstract.add(member);
47 else {
48 mySelectedNormal.add(member);
49 mySelectedAbstract.remove(member);
55 public Set<? extends T> getDependent() {
56 if(myDependencies == null) {
57 myDependencies = new HashSet<T>();
58 myDependenciesToDependent = new HashMap<T, HashSet<T>>();
59 for (T member : myMembers) {
60 Set<T> dependent = myMemberDependenciesStorage.getMemberDependencies(member);
61 for (final T aDependent : dependent) {
62 if (mySelectedNormal.contains(aDependent) && !mySelectedAbstract.contains(aDependent)) {
63 myDependencies.add(member);
64 HashSet<T> deps = myDependenciesToDependent.get(member);
65 if (deps == null) {
66 deps = new HashSet<T>();
67 myDependenciesToDependent.put(member, deps);
69 deps.add(aDependent);
75 return myDependencies;
78 public Set<? extends T> getDependenciesOf(T member) {
79 final Set<? extends T> dependent = getDependent();
80 if(!dependent.contains(member)) return null;
81 return myDependenciesToDependent.get(member);
84 public String getElementTooltip(T element) {
85 final Set<? extends T> dependencies = getDependenciesOf(element);
86 if (dependencies == null || dependencies.size() == 0) return null;
88 ArrayList<String> strings = new ArrayList<String>();
89 for (T dep : dependencies) {
90 if (dep instanceof PsiNamedElement) {
91 strings.add(((PsiNamedElement)dep).getName());
95 if (strings.isEmpty()) return null;
96 return RefactoringBundle.message("uses.0", StringUtil.join(strings, ", "));