avoid collectDependsOn when target module is known (IDEA-175737)

This commit is contained in:
Anna.Kozlova
2017-07-13 18:24:00 +02:00
parent 240fd7e38c
commit d32baa1e28
2 changed files with 45 additions and 17 deletions
@@ -38,10 +38,7 @@ import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.CompilerModuleExtension;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.ui.LabeledComponent;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.text.StringUtil;
@@ -416,6 +413,23 @@ public class ConfigurationsTest extends BaseConfigurationTestCase {
}
}
public void testOriginalModule() throws Exception {
ModuleRootModificationUtil.addDependency(getModule1(), getModule2(), DependencyScope.TEST, true);
ModuleRootModificationUtil.addDependency(getModule2(), getModule3(), DependencyScope.TEST, false);
assertTrue(ModuleBasedConfiguration.canRestoreOriginalModule(getModule1(), new Module[] {getModule2()}));
assertTrue(ModuleBasedConfiguration.canRestoreOriginalModule(getModule1(), new Module[] {getModule3()}));
//not exported but on the classpath
addModule("module4");
ModuleRootModificationUtil.addDependency(getModule3(), getModule4(), DependencyScope.TEST, false);
assertTrue(ModuleBasedConfiguration.canRestoreOriginalModule(getModule1(), new Module[] {getModule4()}));
addModule("module5");
assertFalse(ModuleBasedConfiguration.canRestoreOriginalModule(getModule1(), new Module[] {getModule(4)}));
assertFalse(ModuleBasedConfiguration.canRestoreOriginalModule(getModule2(), new Module[] {getModule1()}));
}
private void assignJdk(Module module) {
myJdk = ModuleRootManager.getInstance(myModule).getSdk();
ModuleRootModificationUtil.setModuleSdk(module, myJdk);
@@ -20,9 +20,10 @@ import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.util.ArrayUtil;
import com.intellij.util.xmlb.annotations.Property;
import gnu.trove.THashSet;
import org.jdom.Element;
@@ -30,9 +31,7 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
import java.util.*;
/**
* Base class for a configuration that is associated with a specific module. For example, Java run configurations use the selected module
@@ -121,19 +120,34 @@ public abstract class ModuleBasedConfiguration<ConfigurationModule extends RunCo
}
public void restoreOriginalModule(final Module originalModule) {
if (originalModule == null) {
return;
}
Set<Module> modules = new THashSet<>();
for (Module classModule : getModules()) {
ModuleUtilCore.collectModulesDependsOn(classModule, modules);
}
if (modules.contains(originalModule)) {
if (canRestoreOriginalModule(originalModule, getModules())) {
setModule(originalModule);
}
}
public static boolean canRestoreOriginalModule(Module originalModule, Module[] configModules) {
if (originalModule == null || configModules.length == 0) {
return false;
}
Deque<Module> queue = new ArrayDeque<>();
queue.addLast(originalModule);
Set<Module> modules = new THashSet<>();
while (!queue.isEmpty()) {
Module module = queue.removeFirst();
//configModules contains 1 element
if (ArrayUtil.contains(module, configModules)) {
return true;
}
for (Module next : ModuleRootManager.getInstance(module).getModuleDependencies(true)) {
if (!modules.add(next)) continue;
queue.addLast(next);
}
}
return false;
}
public void onNewConfigurationCreated() {
final RunConfigurationModule configurationModule = getConfigurationModule();
if (configurationModule.getModule() == null) {