From d2cf94c59cec742ef0a281a908bb5c228ca811ce Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 22 Oct 2018 14:39:15 +0300 Subject: [PATCH] devkit: fix generation of IntelliJ Platform SDK roots when creating SDK for a directory with IDEA sources Include into the SDK all modules reachable via dependencies from the main module. This way we won't need to manually maintain list of exclusions. This fixes IDEA-200152, IDEA-200161. --- .../devkit-core/src/projectRoots/IdeaJdk.java | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/plugins/devkit/devkit-core/src/projectRoots/IdeaJdk.java b/plugins/devkit/devkit-core/src/projectRoots/IdeaJdk.java index 6ccd1f75e27b..ae68a8d3758b 100644 --- a/plugins/devkit/devkit-core/src/projectRoots/IdeaJdk.java +++ b/plugins/devkit/devkit-core/src/projectRoots/IdeaJdk.java @@ -26,7 +26,6 @@ import com.intellij.psi.impl.compiled.ClsParsingUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.JBIterable; import icons.DevkitIcons; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -52,10 +51,9 @@ import javax.swing.*; import java.io.DataInputStream; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -338,31 +336,28 @@ public class IdeaJdk extends JavaDependentSdkType implements JavaSdkType { if (internalJava != null && isValidInternalJdk(sdk, internalJava)) { setInternalJdk(sdk, sdkModificator, internalJava); } - Set addedRoots = ContainerUtil.newTroveSet(); - VirtualFileManager vfsManager = VirtualFileManager.getInstance(); - JpsJavaExtensionService javaService = JpsJavaExtensionService.getInstance(); - boolean isUltimate = vfsManager.findFileByUrl(VfsUtilCore.pathToUrl(sdkHome + "/ultimate/ultimate-resources")) != null; - Set suppressedModules = ContainerUtil.newTroveSet("jps-plugin-system"); - Set ultimateModules = ContainerUtil.newTroveSet( - "intellij.platform.commercial", "intellij.idea.ultimate.resources", - "intellij.platform.commercial.verifier", "intellij.platform.commercial.license", - "intellij.platform.propertyInspector", - "intellij.platform.graph", "intellij.platform.graph.impl", - "intellij.diagram", "intellij.diagram.impl", "intellij.uml"); - List modules = JBIterable.from(model.getProject().getModules()) - .filter(o -> { - if (suppressedModules.contains(o.getName())) return false; - if (o.getName().endsWith("-ide")) return false; - String contentUrl = ContainerUtil.getFirstItem(o.getContentRootsList().getUrls()); - if (contentUrl == null) return true; - // add only community modules/plugins to avoid EP duplicates & minor IDE conflicts - return !isUltimate || - contentUrl.contains("/community/") && !contentUrl.contains("/community/python") || - ultimateModules.contains(o.getName()); - }) - .toList(); + + Map moduleByName = model.getProject().getModules().stream().collect(Collectors.toMap(JpsModule::getName, Function.identity())); + String[] mainModuleCandidates = { + "intellij.idea.ultimate.main", + "intellij.idea.community.main", + "main", + "community-main" + }; + JpsModule mainModule = Arrays.stream(mainModuleCandidates).map(moduleByName::get).filter(Objects::nonNull).findFirst().orElse(null); + if (mainModule == null) { + LOG.error("Cannot find main module (" + Arrays.toString(mainModuleCandidates) + ") in IntelliJ IDEA sources at " + sdkHome); + return; + } + + Set modules = new LinkedHashSet<>(); + JpsJavaExtensionService.dependencies(mainModule).recursively().processModules(modules::add); + indicator.setIndeterminate(false); double delta = 1 / (2 * Math.max(0.5, modules.size())); + JpsJavaExtensionService javaService = JpsJavaExtensionService.getInstance(); + VirtualFileManager vfsManager = VirtualFileManager.getInstance(); + Set addedRoots = ContainerUtil.newTroveSet(); for (JpsModule o : modules) { indicator.setFraction(indicator.getFraction() + delta); for (JpsDependencyElement dep : o.getDependenciesList().getDependencies()) {