diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java index 31d97bd8a002..e9eb344f263c 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java @@ -8,11 +8,12 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.roots.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.containers.Queue; +import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.HashSet; -import java.util.List; import java.util.Set; /** @@ -34,24 +35,26 @@ public class ModuleWithDependentsScope extends GlobalSearchScope { myModules = new HashSet(); myModules.add(myModule); - List dependents = ModuleManager.getInstance(myModule.getProject()).getModuleDependentModules(myModule); - for (Module dependent : dependents) { - addExportedModules(dependent, myModule); - } - myModules.addAll(dependents); //important to add after the previous loop + + fillModules(); } - private void addExportedModules(Module dependentModule, Module module) { + private void fillModules() { + Queue walkingQueue = new Queue(10); + walkingQueue.addLast(myModule); - OrderEntry[] orderEntries = ModuleRootManager.getInstance(dependentModule).getOrderEntries(); - for (OrderEntry orderEntry : orderEntries) { - if (orderEntry instanceof ModuleOrderEntry && module.equals(((ModuleOrderEntry)orderEntry).getModule())) { - if (((ModuleOrderEntry)orderEntry).isExported()) { - List nextLevelModules = ModuleManager.getInstance(myModule.getProject()).getModuleDependentModules(dependentModule); - for (Module nextLevelModule : nextLevelModules) { - if (!myModules.contains(nextLevelModule)) { //Could be true in case of circular dependencies - myModules.add(nextLevelModule); - addExportedModules(nextLevelModule, dependentModule); + Module[] allModules = ModuleManager.getInstance(myModule.getProject()).getModules(); + Set processed = new THashSet(); + + while (!walkingQueue.isEmpty()) { + Module current = walkingQueue.pullFirst(); + processed.add(current); + for (Module dependent : allModules) { + for (OrderEntry orderEntry : ModuleRootManager.getInstance(dependent).getOrderEntries()) { + if (orderEntry instanceof ModuleOrderEntry && current.equals(((ModuleOrderEntry)orderEntry).getModule())) { + myModules.add(dependent); + if (!processed.contains(dependent) && ((ModuleOrderEntry)orderEntry).isExported()) { + walkingQueue.addLast(dependent); } } } @@ -59,6 +62,7 @@ public class ModuleWithDependentsScope extends GlobalSearchScope { } } + public boolean contains(VirtualFile file) { Module moduleOfFile = myProjectFileIndex.getModuleForFile(file); if (moduleOfFile == null) return false;