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
;
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
);
43 if (memberInfo
.isToAbstract()) {
44 mySelectedNormal
.remove(member
);
45 mySelectedAbstract
.add(member
);
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
);
66 deps
= new HashSet
<T
>();
67 myDependenciesToDependent
.put(member
, deps
);
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
, ", "));