improved modules dependencies diagram, added 'Show module cycles' intention action

This commit is contained in:
nik
2011-06-08 16:17:09 +04:00
parent 310e37f50b
commit 57461b8096
3 changed files with 27 additions and 6 deletions
@@ -130,7 +130,16 @@ public abstract class ModuleManager {
* @return the module dependency graph.
*/
@NotNull public abstract Graph<Module> moduleGraph();
/**
* Returns the graph of dependencies between modules in the project.
*
* @param includeTests whether test-only dependencies should be included
* @return the module dependency graph.
* @since 11.0
*/
@NotNull public abstract Graph<Module> moduleGraph(boolean includeTests);
/**
* Adds a listener for receiving notifications to the module structure of the project.
*
@@ -534,8 +534,14 @@ public class ModuleManagerImpl extends ModuleManager implements ProjectComponent
@NotNull
public Graph<Module> moduleGraph() {
return moduleGraph(true);
}
@NotNull
@Override
public Graph<Module> moduleGraph(boolean includeTests) {
ApplicationManager.getApplication().assertReadAccessAllowed();
return myModuleModel.moduleGraph();
return myModuleModel.moduleGraph(includeTests);
}
@NotNull public List<Module> getModuleDependentModules(@NotNull Module module) {
@@ -782,18 +788,18 @@ public class ModuleManagerImpl extends ModuleManager implements ProjectComponent
}
private Comparator<Module> moduleDependencyComparator() {
DFSTBuilder<Module> builder = new DFSTBuilder<Module>(moduleGraph());
DFSTBuilder<Module> builder = new DFSTBuilder<Module>(moduleGraph(true));
return builder.comparator();
}
private Graph<Module> moduleGraph() {
private Graph<Module> moduleGraph(final boolean includeTests) {
return GraphGenerator.create(CachingSemiGraph.create(new GraphGenerator.SemiGraph<Module>() {
public Collection<Module> getNodes() {
return myPathToModule.values();
}
public Iterator<Module> getIn(Module m) {
Module[] dependentModules = ModuleRootManager.getInstance(m).getDependencies();
Module[] dependentModules = ModuleRootManager.getInstance(m).getDependencies(includeTests);
return Arrays.asList(dependentModules).iterator();
}
}));
@@ -289,10 +289,16 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume
forEach(new Processor<OrderEntry>() {
@Override
public boolean process(OrderEntry orderEntry) {
if (orderEntry instanceof ModuleSourceOrderEntry) {
if (myRecursively && orderEntry instanceof ModuleSourceOrderEntry) {
final Module module = ((ModuleSourceOrderEntry)orderEntry).getRootModel().getModule();
return processor.process(module);
}
else if (!myRecursively && orderEntry instanceof ModuleOrderEntry) {
final Module module = ((ModuleOrderEntry)orderEntry).getModule();
if (module != null) {
return processor.process(module);
}
}
return true;
}
});