From 07466798de713d8dc69a6ba0bafb7f4e4eebc527 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 4 Sep 2019 20:47:54 +0300 Subject: [PATCH] Post-review cleanup (IDEA-CR-52079) GitOrigin-RevId: 95a6971c1dbd86de45f3807c24f2544d3796293f --- .../JavaTestFrameworkRunnableState.java | 43 ++++++++--------- .../impl/analysis/JavaModuleGraphUtil.java | 46 ++++++++----------- 2 files changed, 38 insertions(+), 51 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java index e96f4912cfc6..42c1ff61bd41 100644 --- a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java +++ b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java @@ -361,15 +361,13 @@ public abstract class JavaTestFrameworkRunnableState JavaModuleGraphUtil.findDescriptorByModule(module, true)); - if (currentModule != null) { - //add current module explicitly as it's not reachable from `idea.rt` auto modules + DumbService dumb = DumbService.getInstance(module.getProject()); + PsiJavaModule testModule = dumb.computeWithAlternativeResolveEnabled(() -> JavaModuleGraphUtil.findDescriptorByModule(module, true)); + if (testModule != null) { + //adding the test module explicitly as it is unreachable from `idea.rt` ParametersList vmParametersList = javaParameters.getVMParametersList(); vmParametersList.add("--add-modules"); - vmParametersList.add(currentModule.getName()); - + vmParametersList.add(testModule.getName()); //setup module path PathsList classPath = javaParameters.getClassPath(); PathsList modulePath = javaParameters.getModulePath(); @@ -377,7 +375,10 @@ public abstract class JavaTestFrameworkRunnableState JavaModuleGraphUtil.findDescriptorByModule(module, false)); + if (prodModule != null) { + splitDepsBetweenModuleAndClasspath(javaParameters, module, prodModule); + } } } @@ -385,25 +386,18 @@ public abstract class JavaTestFrameworkRunnableState JavaModuleGraphUtil.findDescriptorByModule(module, false)); - if (prodModule == null) { - return; - } + private static void splitDepsBetweenModuleAndClasspath(JavaParameters javaParameters, Module module, PsiJavaModule prodModule) { CompilerModuleExtension compilerExt = CompilerModuleExtension.getInstance(module); - if (compilerExt == null) { - return; - } + if (compilerExt == null) return; + PathsList modulePath = javaParameters.getModulePath(); PathsList classPath = javaParameters.getClassPath(); //put all transitive required modules on the module path - Set allRequires = JavaModuleGraphUtil.getAllRequires(prodModule); - JarFileSystem instance = JarFileSystem.getInstance(); + Set allRequires = JavaModuleGraphUtil.getAllDependencies(prodModule); + JarFileSystem jarFS = JarFileSystem.getInstance(); for (PsiJavaModule javaModule : allRequires) { - VirtualFile virtualFile = instance.getLocalVirtualFileFor(PsiImplUtil.getModuleVirtualFile(javaModule)); + VirtualFile virtualFile = jarFS.getLocalVirtualFileFor(PsiImplUtil.getModuleVirtualFile(javaModule)); if (virtualFile != null) { classPath.remove(virtualFile.getPath()); modulePath.add(virtualFile.getPath()); @@ -417,7 +411,6 @@ public abstract class JavaTestFrameworkRunnableState getAllRequires(PsiJavaModule source) { - return getRequiresGraph(source).getAllRequires(source); + public static Set getAllDependencies(PsiJavaModule source) { + return getRequiresGraph(source).getAllDependencies(source); } @Nullable @@ -133,7 +133,7 @@ public class JavaModuleGraphUtil { /* * Looks for cycles between Java modules in the project sources. - * Library/JDK modules are excluded - in assumption there can't be any lib -> src dependencies. + * Library/JDK modules are excluded - in an assumption there can't be any lib -> src dependencies. * Module references are resolved "globally" (i.e., without taking project dependencies into account). */ private static List> findCycles(Project project) { @@ -213,7 +213,7 @@ public class JavaModuleGraphUtil { return new RequiresGraph(graph, transitiveEdges); } - private static void visit(PsiJavaModule module, MultiMap relations, Set transitiveEdges) { + private static void visit(PsiJavaModule module, MultiMap relations, Set transitiveEdges) { if (!(module instanceof LightJavaModule) && !relations.containsKey(module)) { relations.putValues(module, Collections.emptyList()); boolean explicitJavaBase = false; @@ -272,15 +272,11 @@ public class JavaModuleGraphUtil { return processExports(module, (pkg, m) -> packageName.equals(pkg) ? m : null); } - private T processExports(PsiJavaModule start, BiFunction processor) { + private T processExports(PsiJavaModule start, BiFunction processor) { return myGraph.getNodes().contains(start) ? processExports(start.getName(), start, 0, new HashSet<>(), processor) : null; } - private T processExports(String name, - PsiJavaModule module, - int layer, - Set visited, - BiFunction processor) { + private T processExports(String name, PsiJavaModule module, int layer, Set visited, BiFunction processor) { if (visited.add(module)) { if (layer == 1) { for (PsiPackageAccessibilityStatement statement : module.getExports()) { @@ -292,8 +288,7 @@ public class JavaModuleGraphUtil { } } if (layer < 2) { - Iterator iterator = myGraph.getIn(module); - while (iterator.hasNext()) { + for (Iterator iterator = myGraph.getIn(module); iterator.hasNext();) { PsiJavaModule dependency = iterator.next(); if (layer == 0 || myTransitiveEdges.contains(key(dependency, module))) { T result = processExports(name, dependency, 1, visited, processor); @@ -310,22 +305,21 @@ public class JavaModuleGraphUtil { return module.getName() + '/' + exporter.getName(); } - public Set getAllRequires(PsiJavaModule module) { - HashSet requires = new HashSet<>(); - new Object() { - void traverse(PsiJavaModule m) { - for (Iterator iterator = myGraph.getIn(m); iterator.hasNext();) { - final PsiJavaModule dep = iterator.next(); - if (!requires.contains(dep)) { - requires.add(dep); - traverse(dep); - } - } - } - }.traverse(module); - + public Set getAllDependencies(PsiJavaModule module) { + Set requires = new HashSet<>(); + collectDependencies(module, requires); return requires; } + + private void collectDependencies(PsiJavaModule module, Set dependencies) { + for (Iterator iterator = myGraph.getIn(module); iterator.hasNext();) { + PsiJavaModule dependency = iterator.next(); + if (!dependencies.contains(dependency)) { + dependencies.add(dependency); + collectDependencies(dependency, dependencies); + } + } + } } private static class ChameleonGraph implements Graph {