[java] module path in app. run configuration; simplified

This commit is contained in:
Roman Shevchenko
2016-10-21 11:52:39 +02:00
parent 43119c45b3
commit 4cedb6bb4d
3 changed files with 5 additions and 63 deletions
@@ -30,19 +30,14 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.options.SettingsEditorGroup;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.OrderEnumerator;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiJavaModule;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.util.PsiMethodUtil;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.util.PathsList;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -50,7 +45,6 @@ import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Stream;
public class ApplicationConfiguration extends ModuleBasedConfiguration<JavaRunConfigurationModule>
implements CommonJavaRunConfigurationParameters, SingleClassConfiguration, RefactoringListenerProvider {
@@ -292,34 +286,9 @@ public class ApplicationConfiguration extends ModuleBasedConfiguration<JavaRunCo
PsiJavaModule mainModule = JavaModuleGraphUtil.findDescriptorByElement(mainClass);
if (mainModule != null) {
params.setModuleName(mainModule.getModuleName());
PathsList modulePath = params.getModulePath(), classPath = params.getClassPath();
ProjectFileIndex index = ProjectFileIndex.SERVICE.getInstance(module.getProject());
JavaModuleGraphUtil.moduleDependencies(mainModule).stream()
.map(PsiImplUtil::getModuleVirtualFile)
.flatMap(f -> classRoots(f, index))
.forEach(f -> {
modulePath.add(f);
classPath.remove(f);
});
params.getModulePath().addAll(params.getClassPath().getPathList());
}
}
}
private static Stream<VirtualFile> classRoots(VirtualFile file, ProjectFileIndex index) {
if (index.isInSourceContent(file)) {
Module module = index.getModuleForFile(file);
if (module != null) {
return Stream.of(OrderEnumerator.orderEntries(module).runtimeOnly().withoutSdk().withoutLibraries().withoutDepModules().getClassesRoots());
}
}
else {
VirtualFile root = index.getClassRootForFile(file);
if (root != null) {
return Stream.of(root);
}
}
return Stream.empty();
}
}
}
@@ -63,14 +63,10 @@ public class JavaModuleGraphUtil {
}
public static boolean reads(@NotNull PsiJavaModule source, @NotNull PsiJavaModule destination) {
return getRequiresGraph(source).reads(source, destination);
}
@NotNull
public static Collection<PsiJavaModule> moduleDependencies(@NotNull PsiJavaModule start) {
Set<PsiJavaModule> result = ContainerUtil.newHashSet();
visit(getRequiresGraph(start), start, result);
return result;
Project project = source.getProject();
RequiresGraph graph = CachedValuesManager.getManager(project).getCachedValue(project, () ->
Result.create(buildRequiresGraph(project), OUT_OF_CODE_BLOCK_MODIFICATION_COUNT));
return graph.reads(source, destination);
}
// Looks for cycles between Java modules in the project sources.
@@ -121,12 +117,6 @@ public class JavaModuleGraphUtil {
return map;
}
private static RequiresGraph getRequiresGraph(@NotNull PsiJavaModule source) {
Project project = source.getProject();
return CachedValuesManager.getManager(project).getCachedValue(project, () ->
Result.create(buildRequiresGraph(project), OUT_OF_CODE_BLOCK_MODIFICATION_COUNT));
}
// Starting from source modules, collects all module dependencies in the project.
// The resulting graph is used for tracing readability.
private static RequiresGraph buildRequiresGraph(Project project) {
@@ -158,12 +148,6 @@ public class JavaModuleGraphUtil {
}
}
private static void visit(RequiresGraph graph, PsiJavaModule module, Set<PsiJavaModule> result) {
if (result.add(module)) {
graph.dependencies(module).forEach(dependency -> visit(graph, dependency, result));
}
}
private static class RequiresGraph {
private final Graph<PsiJavaModule> myGraph;
private final Set<String> myPublicEdges;
@@ -187,10 +171,6 @@ public class JavaModuleGraphUtil {
return false;
}
public Iterable<PsiJavaModule> dependencies(PsiJavaModule node) {
return myGraph.getNodes().contains(node) ? () -> myGraph.getIn(node) : Collections.emptyList();
}
public static String key(PsiJavaModule module, PsiJavaModule exporter) {
return module.getModuleName() + '/' + exporter.getModuleName();
}
@@ -81,13 +81,6 @@ public class PathsList {
add(LOCAL_PATH.fun(file));
}
public void remove(VirtualFile file) {
String path = LOCAL_PATH.fun(file);
if (path != null) {
remove(path);
}
}
public void addFirst(String path) {
int index = 0;
for (String element : chooseFirstTimeItems(path)) {