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
.util
.classMembers
;
11 import com
.intellij
.openapi
.diagnostic
.Logger
;
12 import com
.intellij
.openapi
.util
.text
.StringUtil
;
13 import com
.intellij
.psi
.PsiClass
;
14 import com
.intellij
.psi
.PsiMember
;
15 import com
.intellij
.refactoring
.RefactoringBundle
;
16 import com
.intellij
.util
.containers
.HashMap
;
18 import java
.util
.ArrayList
;
19 import java
.util
.HashSet
;
22 public class UsesMemberDependencyGraph
implements MemberDependencyGraph
{
23 private static final Logger LOG
= Logger
.getInstance("#com.intellij.refactoring.util.classMembers.UsesMemberDependencyGraph");
24 protected HashSet
<PsiMember
> mySelectedNormal
;
25 protected HashSet
<PsiMember
> mySelectedAbstract
;
26 protected HashSet
<PsiMember
> myDependencies
= null;
27 protected HashMap
<PsiMember
,HashSet
<PsiMember
>> myDependenciesToDependentMap
= null;
28 private final boolean myRecursive
;
29 private final MemberDependenciesStorage myMemberDependenciesStorage
;
31 public UsesMemberDependencyGraph(PsiClass aClass
, PsiClass superClass
, boolean recursive
) {
32 myRecursive
= recursive
;
33 mySelectedNormal
= new HashSet
<PsiMember
>();
34 mySelectedAbstract
= new HashSet
<PsiMember
>();
35 myMemberDependenciesStorage
= new MemberDependenciesStorage(aClass
, superClass
);
39 public Set
<?
extends PsiMember
> getDependent() {
40 if (myDependencies
== null) {
41 myDependencies
= new HashSet
<PsiMember
>();
42 myDependenciesToDependentMap
= new HashMap
<PsiMember
, HashSet
<PsiMember
>>();
43 buildDeps(null, mySelectedNormal
);
45 return myDependencies
;
48 public Set
<?
extends PsiMember
> getDependenciesOf(PsiMember member
) {
49 final Set dependent
= getDependent();
50 if(!dependent
.contains(member
)) return null;
51 return myDependenciesToDependentMap
.get(member
);
54 public String
getElementTooltip(PsiMember element
) {
55 final Set
<?
extends PsiMember
> dependencies
= getDependenciesOf(element
);
56 if(dependencies
== null || dependencies
.size() == 0) return null;
58 ArrayList
<String
> strings
= new ArrayList
<String
>();
59 for (PsiMember dep
: dependencies
) {
60 strings
.add(dep
.getName());
63 if(strings
.isEmpty()) return null;
64 return RefactoringBundle
.message("used.by.0", StringUtil
.join(strings
, ", "));
68 private void buildDeps(PsiMember sourceElement
, Set
<PsiMember
> members
) {
70 buildDepsRecursively(sourceElement
, members
);
73 for (final PsiMember member
: members
) {
74 for (final PsiMember dependency
: myMemberDependenciesStorage
.getMemberDependencies(member
)) {
75 addDependency(dependency
, member
);
81 private void buildDepsRecursively(final PsiMember sourceElement
, final Set
<PsiMember
> members
) {
82 for (PsiMember member
: members
) {
83 if (!myDependencies
.contains(member
)) {
84 addDependency(member
, sourceElement
);
85 if (!mySelectedAbstract
.contains(member
)) {
86 buildDepsRecursively(member
, myMemberDependenciesStorage
.getMemberDependencies(member
));
92 private void addDependency(final PsiMember member
, final PsiMember sourceElement
) {
93 if (LOG
.isDebugEnabled()) {
94 LOG
.debug(member
.toString());
96 myDependencies
.add(member
);
97 if (sourceElement
!= null) {
98 HashSet
<PsiMember
> relations
= myDependenciesToDependentMap
.get(member
);
99 if (relations
== null) {
100 relations
= new HashSet
<PsiMember
>();
101 myDependenciesToDependentMap
.put(member
, relations
);
103 relations
.add(sourceElement
);
107 public void memberChanged(MemberInfo memberInfo
) {
108 if (ClassMembersUtil
.isProperMember(memberInfo
)) {
109 myDependencies
= null;
110 myDependenciesToDependentMap
= null;
111 PsiMember member
= memberInfo
.getMember();
112 if (!memberInfo
.isChecked()) {
113 mySelectedNormal
.remove(member
);
114 mySelectedAbstract
.remove(member
);
116 if (memberInfo
.isToAbstract()) {
117 mySelectedNormal
.remove(member
);
118 mySelectedAbstract
.add(member
);
120 mySelectedNormal
.add(member
);
121 mySelectedAbstract
.remove(member
);