Post-review cleanup (IDEA-CR-52079)

GitOrigin-RevId: 95a6971c1dbd86de45f3807c24f2544d3796293f
This commit is contained in:
Roman Shevchenko
2019-09-04 18:01:43 +00:00
committed by intellij-monorepo-bot
parent 7dd4862fb1
commit 07466798de
2 changed files with 38 additions and 51 deletions
@@ -361,15 +361,13 @@ public abstract class JavaTestFrameworkRunnableState<T extends
}
private static void configureModulePath(JavaParameters javaParameters, @NotNull Module module) {
DumbService dumbService = DumbService.getInstance(module.getProject());
PsiJavaModule currentModule =
dumbService.computeWithAlternativeResolveEnabled(() -> 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<T extends
classPath.clear();
}
else {
splitDepsBetweenModuleAndClasspath(module, javaParameters);
PsiJavaModule prodModule = dumb.computeWithAlternativeResolveEnabled(() -> JavaModuleGraphUtil.findDescriptorByModule(module, false));
if (prodModule != null) {
splitDepsBetweenModuleAndClasspath(javaParameters, module, prodModule);
}
}
}
@@ -385,25 +386,18 @@ public abstract class JavaTestFrameworkRunnableState<T extends
* Put dependencies reachable from module-info located in production sources on the module path
* leave all other dependencies on the class path as is
*/
private static void splitDepsBetweenModuleAndClasspath(Module module, JavaParameters javaParameters) {
PsiJavaModule prodModule =
DumbService.getInstance(module.getProject())
.computeWithAlternativeResolveEnabled(() -> 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<PsiJavaModule> allRequires = JavaModuleGraphUtil.getAllRequires(prodModule);
JarFileSystem instance = JarFileSystem.getInstance();
Set<PsiJavaModule> 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<T extends
classPath.remove(out.getPath());
modulePath.add(out.getPath());
}
//ensure test output is merged to the production module
VirtualFile testOutput = compilerExt.getCompilerOutputPathForTests();
if (testOutput != null) {
@@ -425,12 +418,12 @@ public abstract class JavaTestFrameworkRunnableState<T extends
vmParametersList.add(prodModule.getName() + "=" + testOutput.getPath());
}
//ensure test dependencies which are missed from production module info are available in tests
//ensure test dependencies missing from production module descriptor are available in tests
//todo enumerate all test dependencies explicitly
vmParametersList.add("--add-reads");
vmParametersList.add(prodModule.getName() + "=ALL-UNNAMED");
//ensure production module is explicitly added as test starter doesn't depend on it explicitly
//ensure production module is explicitly added as test starter in `idea-rt` doesn't depend on it
vmParametersList.add("--add-modules");
vmParametersList.add(prodModule.getName());
}
@@ -470,7 +463,7 @@ public abstract class JavaTestFrameworkRunnableState<T extends
}
/**
* Configuration based on package which spans multiple modules
* Configuration based on a package spanning multiple modules.
*/
protected boolean forkPerModule() {
return getScope() != TestSearchScope.SINGLE_MODULE &&
@@ -112,8 +112,8 @@ public class JavaModuleGraphUtil {
return getRequiresGraph(source).reads(source, destination);
}
public static Set<PsiJavaModule> getAllRequires(PsiJavaModule source) {
return getRequiresGraph(source).getAllRequires(source);
public static Set<PsiJavaModule> 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<Set<PsiJavaModule>> findCycles(Project project) {
@@ -213,7 +213,7 @@ public class JavaModuleGraphUtil {
return new RequiresGraph(graph, transitiveEdges);
}
private static void visit(PsiJavaModule module, MultiMap<PsiJavaModule, PsiJavaModule> relations, Set<? super String> transitiveEdges) {
private static void visit(PsiJavaModule module, MultiMap<PsiJavaModule, PsiJavaModule> relations, Set<String> 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> T processExports(PsiJavaModule start, BiFunction<? super String, ? super PsiJavaModule, ? extends T> processor) {
private <T> T processExports(PsiJavaModule start, BiFunction<String, PsiJavaModule, T> processor) {
return myGraph.getNodes().contains(start) ? processExports(start.getName(), start, 0, new HashSet<>(), processor) : null;
}
private <T> T processExports(String name,
PsiJavaModule module,
int layer,
Set<? super PsiJavaModule> visited,
BiFunction<? super String, ? super PsiJavaModule, ? extends T> processor) {
private <T> T processExports(String name, PsiJavaModule module, int layer, Set<PsiJavaModule> visited, BiFunction<String, PsiJavaModule, T> processor) {
if (visited.add(module)) {
if (layer == 1) {
for (PsiPackageAccessibilityStatement statement : module.getExports()) {
@@ -292,8 +288,7 @@ public class JavaModuleGraphUtil {
}
}
if (layer < 2) {
Iterator<PsiJavaModule> iterator = myGraph.getIn(module);
while (iterator.hasNext()) {
for (Iterator<PsiJavaModule> 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<PsiJavaModule> getAllRequires(PsiJavaModule module) {
HashSet<PsiJavaModule> requires = new HashSet<>();
new Object() {
void traverse(PsiJavaModule m) {
for (Iterator<PsiJavaModule> iterator = myGraph.getIn(m); iterator.hasNext();) {
final PsiJavaModule dep = iterator.next();
if (!requires.contains(dep)) {
requires.add(dep);
traverse(dep);
}
}
}
}.traverse(module);
public Set<PsiJavaModule> getAllDependencies(PsiJavaModule module) {
Set<PsiJavaModule> requires = new HashSet<>();
collectDependencies(module, requires);
return requires;
}
private void collectDependencies(PsiJavaModule module, Set<PsiJavaModule> dependencies) {
for (Iterator<PsiJavaModule> iterator = myGraph.getIn(module); iterator.hasNext();) {
PsiJavaModule dependency = iterator.next();
if (!dependencies.contains(dependency)) {
dependencies.add(dependency);
collectDependencies(dependency, dependencies);
}
}
}
}
private static class ChameleonGraph<N> implements Graph<N> {