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.
This commit is contained in:
nik
2018-10-22 14:39:34 +03:00
parent 713c282478
commit d2cf94c59c
@@ -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<VirtualFile> addedRoots = ContainerUtil.newTroveSet();
VirtualFileManager vfsManager = VirtualFileManager.getInstance();
JpsJavaExtensionService javaService = JpsJavaExtensionService.getInstance();
boolean isUltimate = vfsManager.findFileByUrl(VfsUtilCore.pathToUrl(sdkHome + "/ultimate/ultimate-resources")) != null;
Set<String> suppressedModules = ContainerUtil.newTroveSet("jps-plugin-system");
Set<String> 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<JpsModule> 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<String, JpsModule> 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<JpsModule> 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<VirtualFile> addedRoots = ContainerUtil.newTroveSet();
for (JpsModule o : modules) {
indicator.setFraction(indicator.getFraction() + delta);
for (JpsDependencyElement dep : o.getDependenciesList().getDependencies()) {