mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
reworked algorithm for scope calculation as previous didn't correctly processed deep hops of transitively exported dependencies
This commit is contained in:
+20
-16
@@ -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<Module>();
|
||||
myModules.add(myModule);
|
||||
List<Module> 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<Module> walkingQueue = new Queue<Module>(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<Module> 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<Module> processed = new THashSet<Module>();
|
||||
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user