1 package com
.intellij
.packageDependencies
;
3 import com
.intellij
.analysis
.AnalysisScopeBundle
;
4 import com
.intellij
.openapi
.progress
.ProcessCanceledException
;
5 import com
.intellij
.openapi
.progress
.ProgressIndicator
;
6 import com
.intellij
.openapi
.progress
.ProgressManager
;
7 import com
.intellij
.openapi
.vfs
.VirtualFile
;
8 import com
.intellij
.psi
.PsiElement
;
9 import com
.intellij
.psi
.PsiFile
;
10 import com
.intellij
.usageView
.UsageInfo
;
11 import org
.jetbrains
.annotations
.Nullable
;
15 public class FindDependencyUtil
{
16 private FindDependencyUtil() {}
18 public static UsageInfo
[] findDependencies(@Nullable final DependenciesBuilder builder
, Set
<PsiFile
> searchIn
, Set
<PsiFile
> searchFor
) {
19 final List
<UsageInfo
> usages
= new ArrayList
<UsageInfo
>();
20 ProgressIndicator indicator
= ProgressManager
.getInstance().getProgressIndicator();
21 int totalCount
= searchIn
.size();
24 nextFile
: for (final PsiFile psiFile
: searchIn
) {
25 count
= updateIndicator(indicator
, totalCount
, count
, psiFile
);
27 if (!psiFile
.isValid()) continue;
29 final Set
<PsiFile
> precomputedDeps
;
30 if (builder
!= null) {
31 final Set
<PsiFile
> depsByFile
= builder
.getDependencies().get(psiFile
);
32 precomputedDeps
= depsByFile
!= null ?
new HashSet
<PsiFile
>(depsByFile
) : new HashSet
<PsiFile
>();
33 precomputedDeps
.retainAll(searchFor
);
34 if (precomputedDeps
.isEmpty()) continue nextFile
;
37 precomputedDeps
= Collections
.unmodifiableSet(searchFor
);
40 DependenciesBuilder
.analyzeFileDependencies(psiFile
, new DependenciesBuilder
.DependencyProcessor() {
41 public void process(PsiElement place
, PsiElement dependency
) {
42 PsiFile dependencyFile
= dependency
.getContainingFile();
43 if (precomputedDeps
.contains(dependencyFile
)) {
44 usages
.add(new UsageInfo(place
));
50 return usages
.toArray(new UsageInfo
[usages
.size()]);
53 public static UsageInfo
[] findBackwardDependencies(final DependenciesBuilder builder
, final Set
<PsiFile
> searchIn
, final Set
<PsiFile
> searchFor
) {
54 final List
<UsageInfo
> usages
= new ArrayList
<UsageInfo
>();
55 ProgressIndicator indicator
= ProgressManager
.getInstance().getProgressIndicator();
58 final Set
<PsiFile
> deps
= new HashSet
<PsiFile
>();
59 for (PsiFile psiFile
: searchFor
) {
60 deps
.addAll(builder
.getDependencies().get(psiFile
));
62 deps
.retainAll(searchIn
);
63 if (deps
.isEmpty()) return new UsageInfo
[0];
65 int totalCount
= deps
.size();
67 for (final PsiFile psiFile
: deps
) {
68 count
= updateIndicator(indicator
, totalCount
, count
, psiFile
);
70 DependenciesBuilder
.analyzeFileDependencies(psiFile
, new DependenciesBuilder
.DependencyProcessor() {
71 public void process(PsiElement place
, PsiElement dependency
) {
72 PsiFile dependencyFile
= dependency
.getContainingFile();
73 if (searchFor
.contains(dependencyFile
)) {
74 usages
.add(new UsageInfo(place
));
80 return usages
.toArray(new UsageInfo
[usages
.size()]);
83 private static int updateIndicator(final ProgressIndicator indicator
, final int totalCount
, int count
, final PsiFile psiFile
) {
84 if (indicator
!= null) {
85 if (indicator
.isCanceled()) throw new ProcessCanceledException();
86 indicator
.setFraction(((double)++count
) / totalCount
);
87 final VirtualFile virtualFile
= psiFile
.getVirtualFile();
88 if (virtualFile
!= null) {
89 indicator
.setText(AnalysisScopeBundle
.message("find.dependencies.progress.text", virtualFile
.getPresentableUrl()));