From 0cdacad72ff33ce3ee3961a50c516102ab70bf98 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 15 Jun 2015 17:16:35 +0300 Subject: [PATCH] restore backward dependencies for library classes (IDEA-141154) --- .../BackwardDependenciesBuilder.java | 47 ++++++++++++------- .../ForwardDependenciesBuilder.java | 3 +- .../FindDependencyUtil.java | 6 +++ 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/platform/analysis-impl/src/com/intellij/packageDependencies/BackwardDependenciesBuilder.java b/platform/analysis-impl/src/com/intellij/packageDependencies/BackwardDependenciesBuilder.java index b48cd3a6d092..828096c4930f 100644 --- a/platform/analysis-impl/src/com/intellij/packageDependencies/BackwardDependenciesBuilder.java +++ b/platform/analysis-impl/src/com/intellij/packageDependencies/BackwardDependenciesBuilder.java @@ -24,11 +24,14 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiRecursiveElementVisitor; +import com.intellij.util.Processor; import org.jetbrains.annotations.Nullable; import java.util.HashSet; @@ -85,35 +88,45 @@ public class BackwardDependenciesBuilder extends DependenciesBuilder { psiManager.startBatchFilesProcessingMode(); try { final int fileCount = getScope().getFileCount(); - getScope().accept(new PsiRecursiveElementVisitor() { - @Override public void visitFile(final PsiFile file) { + final boolean includeTestSource = getScope().isIncludeTestSource(); + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(getProject()).getFileIndex(); + getScope().accept(new Processor() { + @Override + public boolean process(final VirtualFile virtualFile) { + if (!includeTestSource && fileIndex.isInTestSourceContent(virtualFile)) { + return true; + } ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); if (indicator != null) { if (indicator.isCanceled()) { throw new ProcessCanceledException(); } indicator.setText(AnalysisScopeBundle.message("package.dependencies.progress.text")); - final VirtualFile virtualFile = file.getVirtualFile(); - if (virtualFile != null) { - indicator.setText2(getRelativeToProjectPath(virtualFile)); - } + indicator.setText2(getRelativeToProjectPath(virtualFile)); if (fileCount > 0) { indicator.setFraction(((double)++myFileCount) / myTotalFileCount); } } - final Map> dependencies = builder.getDependencies(); - for (final PsiFile psiFile : dependencies.keySet()) { - if (dependencies.get(psiFile).contains(file)) { - Set fileDeps = getDependencies().get(file); - if (fileDeps == null) { - fileDeps = new HashSet(); - getDependencies().put(file, fileDeps); + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + final PsiFile file = psiManager.findFile(virtualFile); + if (file != null) { + final Map> dependencies = builder.getDependencies(); + for (final PsiFile psiFile : dependencies.keySet()) { + if (dependencies.get(psiFile).contains(file)) { + Set fileDeps = getDependencies().get(file); + if (fileDeps == null) { + fileDeps = new HashSet(); + getDependencies().put(file, fileDeps); + } + fileDeps.add(psiFile); + } + } + psiManager.dropResolveCaches(); } - fileDeps.add(psiFile); } - } - psiManager.dropResolveCaches(); - InjectedLanguageManager.getInstance(file.getProject()).dropFileCaches(file); + }); + return true; } }); } diff --git a/platform/analysis-impl/src/com/intellij/packageDependencies/ForwardDependenciesBuilder.java b/platform/analysis-impl/src/com/intellij/packageDependencies/ForwardDependenciesBuilder.java index dd0dbac4ff14..f4078c1a2829 100644 --- a/platform/analysis-impl/src/com/intellij/packageDependencies/ForwardDependenciesBuilder.java +++ b/platform/analysis-impl/src/com/intellij/packageDependencies/ForwardDependenciesBuilder.java @@ -138,7 +138,8 @@ public class ForwardDependenciesBuilder extends DependenciesBuilder { (fileIndex.isInContent(virtualFile) || fileIndex.isInLibraryClasses(virtualFile) || fileIndex.isInLibrarySource(virtualFile))) { - found.add(dependencyFile); + final PsiElement navigationElement = dependencyFile.getNavigationElement(); + found.add(navigationElement instanceof PsiFile ? (PsiFile)navigationElement : dependencyFile); } } } diff --git a/platform/lang-impl/src/com/intellij/packageDependencies/FindDependencyUtil.java b/platform/lang-impl/src/com/intellij/packageDependencies/FindDependencyUtil.java index 606754643019..b4f0234c4bca 100644 --- a/platform/lang-impl/src/com/intellij/packageDependencies/FindDependencyUtil.java +++ b/platform/lang-impl/src/com/intellij/packageDependencies/FindDependencyUtil.java @@ -99,6 +99,12 @@ public class FindDependencyUtil { @Override public void process(PsiElement place, PsiElement dependency) { PsiFile dependencyFile = dependency.getContainingFile(); + if (dependencyFile != null) { + final PsiElement navigationElement = dependencyFile.getNavigationElement(); + if (navigationElement instanceof PsiFile) { + dependencyFile = (PsiFile)navigationElement; + } + } if (searchFor.contains(dependencyFile)) { usages.add(new UsageInfo(place)); }