From d32baa1e28e65d4f820272af85533a99482cccbf Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 13 Jul 2017 11:15:03 +0200 Subject: [PATCH] avoid collectDependsOn when target module is known (IDEA-175737) --- .../java/execution/ConfigurationsTest.java | 22 ++++++++-- .../ModuleBasedConfiguration.java | 40 +++++++++++++------ 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java b/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java index deefe1037aae..36b6f5f85781 100644 --- a/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java @@ -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); diff --git a/platform/lang-api/src/com/intellij/execution/configurations/ModuleBasedConfiguration.java b/platform/lang-api/src/com/intellij/execution/configurations/ModuleBasedConfiguration.java index 88f54a4e48d6..e8ca5ae088d6 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/ModuleBasedConfiguration.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/ModuleBasedConfiguration.java @@ -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 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 queue = new ArrayDeque<>(); + queue.addLast(originalModule); + Set 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) {