IDEADEV-21222
[fedora-idea.git] / source / com / intellij / packageDependencies / FindDependencyUtil.java
blobd3cb66e050a08dbd9ff485a96055fdaa5ff59dad
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;
13 import java.util.*;
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();
22 int count = 0;
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;
36 else {
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));
47 });
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();
66 int count = 0;
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));
77 });
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()));
92 return count;