Enumerate module roots directly in ModuleHighlightUtil2.getModuleDescriptor
This is faster than going through FilenameIndex which would call GlobalSearchScope.accept for all "module-info.java" files in the project, and there can be many of those. Also see https://github.com/JetBrains/intellij-community/pull/670
This commit is contained in:
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.modules;
|
|||||||
|
|
||||||
import com.intellij.openapi.module.Module;
|
import com.intellij.openapi.module.Module;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
|
import com.intellij.openapi.roots.ModuleRootManager;
|
||||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
import com.intellij.openapi.roots.ProjectFileIndex;
|
||||||
import com.intellij.openapi.vfs.JarFileSystem;
|
import com.intellij.openapi.vfs.JarFileSystem;
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
@@ -26,17 +27,15 @@ import com.intellij.psi.PsiJavaFile;
|
|||||||
import com.intellij.psi.PsiJavaModule;
|
import com.intellij.psi.PsiJavaModule;
|
||||||
import com.intellij.psi.PsiManager;
|
import com.intellij.psi.PsiManager;
|
||||||
import com.intellij.psi.impl.light.LightJavaModule;
|
import com.intellij.psi.impl.light.LightJavaModule;
|
||||||
import com.intellij.psi.search.FilenameIndex;
|
import kotlin.collections.ArraysKt;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.List;
|
|
||||||
import java.util.jar.Attributes;
|
import java.util.jar.Attributes;
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
import java.util.jar.Manifest;
|
import java.util.jar.Manifest;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static com.intellij.psi.PsiJavaModule.MODULE_INFO_FILE;
|
import static com.intellij.psi.PsiJavaModule.MODULE_INFO_FILE;
|
||||||
|
|
||||||
@@ -81,11 +80,12 @@ public class ModuleHighlightUtil2 {
|
|||||||
Module module = index.getModuleForFile(file);
|
Module module = index.getModuleForFile(file);
|
||||||
if (module != null) {
|
if (module != null) {
|
||||||
boolean isTest = index.isInTestSourceContent(file);
|
boolean isTest = index.isInTestSourceContent(file);
|
||||||
List<VirtualFile> files = FilenameIndex.getVirtualFilesByName(project, MODULE_INFO_FILE, module.getModuleScope()).stream()
|
VirtualFile modularRoot = ArraysKt.singleOrNull(ModuleRootManager.getInstance(module).getSourceRoots(isTest),
|
||||||
.filter(f -> index.isInTestSourceContent(f) == isTest)
|
root -> root.findChild(MODULE_INFO_FILE) != null);
|
||||||
.collect(Collectors.toList());
|
if (modularRoot != null) {
|
||||||
if (files.size() == 1) {
|
VirtualFile moduleInfo = modularRoot.findChild(MODULE_INFO_FILE);
|
||||||
PsiFile psiFile = PsiManager.getInstance(project).findFile(files.get(0));
|
assert moduleInfo != null : modularRoot;
|
||||||
|
PsiFile psiFile = PsiManager.getInstance(project).findFile(moduleInfo);
|
||||||
if (psiFile instanceof PsiJavaFile) {
|
if (psiFile instanceof PsiJavaFile) {
|
||||||
return ((PsiJavaFile) psiFile).getModuleDeclaration();
|
return ((PsiJavaFile) psiFile).getModuleDeclaration();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user