2 * Created by IntelliJ IDEA.
6 * To change template for new class use
7 * Code Style | Class Templates options (Tools | IDE Options).
9 package com
.intellij
.refactoring
.classMembers
;
11 import com
.intellij
.lang
.LanguageDependentMembersRefactoringSupport
;
12 import com
.intellij
.openapi
.diagnostic
.Logger
;
13 import com
.intellij
.openapi
.util
.text
.StringUtil
;
14 import com
.intellij
.psi
.NavigatablePsiElement
;
15 import com
.intellij
.psi
.PsiElement
;
16 import com
.intellij
.refactoring
.RefactoringBundle
;
17 import com
.intellij
.util
.containers
.HashMap
;
19 import java
.util
.ArrayList
;
20 import java
.util
.HashSet
;
23 public class UsesMemberDependencyGraph
<T
extends NavigatablePsiElement
, C
extends PsiElement
, M
extends MemberInfoBase
<T
>> implements MemberDependencyGraph
<T
, M
> {
24 private static final Logger LOG
= Logger
.getInstance("#com.intellij.refactoring.util.classMembers.UsesMemberDependencyGraph");
25 protected HashSet
<T
> mySelectedNormal
;
26 protected HashSet
<T
> mySelectedAbstract
;
27 protected HashSet
<T
> myDependencies
= null;
28 protected HashMap
<T
, HashSet
<T
>> myDependenciesToDependentMap
= null;
29 private final boolean myRecursive
;
30 private final MemberDependenciesStorage
<T
, C
> myMemberDependenciesStorage
;
32 public UsesMemberDependencyGraph(C aClass
, C superClass
, boolean recursive
) {
33 myRecursive
= recursive
;
34 mySelectedNormal
= new HashSet
<T
>();
35 mySelectedAbstract
= new HashSet
<T
>();
36 myMemberDependenciesStorage
= new MemberDependenciesStorage
<T
, C
>(aClass
, superClass
);
40 public Set
<?
extends T
> getDependent() {
41 if (myDependencies
== null) {
42 myDependencies
= new HashSet
<T
>();
43 myDependenciesToDependentMap
= new HashMap
<T
, HashSet
<T
>>();
44 buildDeps(null, mySelectedNormal
);
46 return myDependencies
;
49 public Set
<?
extends T
> getDependenciesOf(T member
) {
50 final Set dependent
= getDependent();
51 if(!dependent
.contains(member
)) return null;
52 return myDependenciesToDependentMap
.get(member
);
55 public String
getElementTooltip(T element
) {
56 final Set
<?
extends T
> dependencies
= getDependenciesOf(element
);
57 if(dependencies
== null || dependencies
.size() == 0) return null;
59 ArrayList
<String
> strings
= new ArrayList
<String
>();
60 for (T dep
: dependencies
) {
61 strings
.add(dep
.getName());
64 if(strings
.isEmpty()) return null;
65 return RefactoringBundle
.message("used.by.0", StringUtil
.join(strings
, ", "));
69 private void buildDeps(T sourceElement
, Set
<T
> members
) {
71 buildDepsRecursively(sourceElement
, members
);
74 for (final T member
: members
) {
75 for (final T dependency
: myMemberDependenciesStorage
.getMemberDependencies(member
)) {
76 addDependency(dependency
, member
);
82 private void buildDepsRecursively(final T sourceElement
, final Set
<T
> members
) {
83 for (T member
: members
) {
84 if (!myDependencies
.contains(member
)) {
85 addDependency(member
, sourceElement
);
86 if (!mySelectedAbstract
.contains(member
)) {
87 buildDepsRecursively(member
, myMemberDependenciesStorage
.getMemberDependencies(member
));
93 private void addDependency(final T member
, final T sourceElement
) {
94 if (LOG
.isDebugEnabled()) {
95 LOG
.debug(member
.toString());
97 myDependencies
.add(member
);
98 if (sourceElement
!= null) {
99 HashSet
<T
> relations
= myDependenciesToDependentMap
.get(member
);
100 if (relations
== null) {
101 relations
= new HashSet
<T
>();
102 myDependenciesToDependentMap
.put(member
, relations
);
104 relations
.add(sourceElement
);
108 public void memberChanged(M memberInfo
) {
109 final ClassMembersRefactoringSupport support
=
110 LanguageDependentMembersRefactoringSupport
.INSTANCE
.forLanguage(memberInfo
.getMember().getLanguage());
111 if (support
!= null && support
.isProperMember(memberInfo
)) {
112 myDependencies
= null;
113 myDependenciesToDependentMap
= null;
114 T member
= memberInfo
.getMember();
115 if (!memberInfo
.isChecked()) {
116 mySelectedNormal
.remove(member
);
117 mySelectedAbstract
.remove(member
);
119 if (memberInfo
.isToAbstract()) {
120 mySelectedNormal
.remove(member
);
121 mySelectedAbstract
.add(member
);
123 mySelectedNormal
.add(member
);
124 mySelectedAbstract
.remove(member
);