mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[by Jan Voung] speedup Groovy Console/Shell action update by not traversing all project modules searching for groovy classes
This commit is contained in:
@@ -8,6 +8,6 @@
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="module" module-name="core-api" exported="" />
|
||||
<orderEntry type="module" module-name="projectModel-api" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
</module>
|
||||
@@ -16,9 +16,24 @@
|
||||
|
||||
package com.intellij.psi.util;
|
||||
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.OrderEntry;
|
||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.JavaPsiFacade;
|
||||
import com.intellij.psi.PsiAnonymousClass;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiModifier;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author mike
|
||||
@@ -42,4 +57,31 @@ public class PsiClassUtil {
|
||||
if (mustNotBeAbstract && aClass.hasModifierProperty(PsiModifier.ABSTRACT)) return false;
|
||||
return aClass.getContainingClass() == null || aClass.hasModifierProperty(PsiModifier.STATIC);
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches the project for modules that contain the class with the specified full-qualified name within
|
||||
* the module dependencies or libraries.
|
||||
*
|
||||
* @param qualifiedName the full-qualified name of the class to find.
|
||||
* @return the modules that contain the given class in dependencies or libraries.
|
||||
*/
|
||||
@NotNull
|
||||
public static Collection<Module> findModulesWithClass(@NotNull Project project, @NonNls @NotNull String qualifiedName) {
|
||||
GlobalSearchScope allScope = GlobalSearchScope.allScope(project);
|
||||
JavaPsiFacade facade = JavaPsiFacade.getInstance(project);
|
||||
PsiClass[] possibleClasses = facade.findClasses(qualifiedName, allScope);
|
||||
if (possibleClasses.length == 0) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
Set<Module> relevantModules = ContainerUtil.newLinkedHashSet();
|
||||
ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
|
||||
for (PsiClass aClass : possibleClasses) {
|
||||
VirtualFile classFile = aClass.getContainingFile().getVirtualFile();
|
||||
for (OrderEntry orderEntry : fileIndex.getOrderEntriesForFile(classFile)) {
|
||||
relevantModules.add(orderEntry.getOwnerModule());
|
||||
}
|
||||
}
|
||||
return relevantModules;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,9 +16,14 @@
|
||||
package com.intellij.psi.impl.cache.impl;
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.ex.PathManagerEx;
|
||||
import com.intellij.openapi.command.WriteCommandAction;
|
||||
import com.intellij.openapi.fileEditor.FileDocumentManager;
|
||||
import com.intellij.openapi.fileTypes.FileTypeManager;
|
||||
import com.intellij.openapi.module.ModifiableModuleModel;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleManager;
|
||||
import com.intellij.openapi.module.StdModuleTypes;
|
||||
import com.intellij.openapi.roots.ContentEntry;
|
||||
import com.intellij.openapi.roots.ModifiableRootModel;
|
||||
import com.intellij.openapi.roots.ModuleRootManager;
|
||||
@@ -29,11 +34,15 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiDocumentManager;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.util.PsiClassUtil;
|
||||
import com.intellij.testFramework.PsiTestCase;
|
||||
import com.intellij.testFramework.PsiTestUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author max
|
||||
@@ -139,4 +148,64 @@ public class FindClassTest extends PsiTestCase {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void testMultipleModules() throws Exception {
|
||||
List<Module> otherModules = configureTwoMoreModules();
|
||||
assertSize(2, otherModules);
|
||||
PsiClass psiClass = myJavaFacade.findClass("p.A", getModule().getModuleWithDependenciesAndLibrariesScope(true));
|
||||
assertNotNull(psiClass);
|
||||
assertEquals("p.A", psiClass.getQualifiedName());
|
||||
|
||||
PsiClass packClass1 = myJavaFacade.findClass("pack.MyClass", getModule().getModuleWithDependenciesAndLibrariesScope(true));
|
||||
assertNull(packClass1);
|
||||
|
||||
PsiClass psiClass2 = myJavaFacade.findClass("p.A", otherModules.get(0).getModuleWithDependenciesAndLibrariesScope(true));
|
||||
assertNotNull(psiClass2);
|
||||
assertEquals("p.A", psiClass2.getQualifiedName());
|
||||
|
||||
PsiClass packClass2 = myJavaFacade.findClass("pack.MyClass", otherModules.get(0).getModuleWithDependenciesAndLibrariesScope(true));
|
||||
assertNotNull(packClass2);
|
||||
assertEquals("pack.MyClass", packClass2.getQualifiedName());
|
||||
|
||||
PsiClass psiClass3 = myJavaFacade.findClass("p.A", otherModules.get(1).getModuleWithDependenciesAndLibrariesScope(true));
|
||||
assertNull(psiClass3);
|
||||
|
||||
PsiClass packClass3 = myJavaFacade.findClass("pack.MyClass", otherModules.get(1).getModuleWithDependenciesAndLibrariesScope(true));
|
||||
assertNull(packClass3);
|
||||
}
|
||||
|
||||
public void testFindModulesWithClass() throws Exception {
|
||||
List<Module> otherModules = configureTwoMoreModules();
|
||||
assertSize(2, otherModules);
|
||||
|
||||
PsiClass psiClass = myJavaFacade.findClass("p.A", getModule().getModuleWithDependenciesAndLibrariesScope(true));
|
||||
assertNotNull(psiClass);
|
||||
PsiClass psiClass2 = myJavaFacade.findClass("p.A", otherModules.get(0).getModuleWithDependenciesAndLibrariesScope(true));
|
||||
assertNotNull(psiClass2);
|
||||
Collection<Module> modules = PsiClassUtil.findModulesWithClass(myProject, "p.A");
|
||||
assertSameElements(modules, getModule(), otherModules.get(0));
|
||||
|
||||
PsiClass packClass = myJavaFacade.findClass("pack.MyClass", otherModules.get(0).getModuleWithDependenciesAndLibrariesScope(true));
|
||||
assertNotNull(packClass);
|
||||
Collection<Module> packModules = PsiClassUtil.findModulesWithClass(myProject, "pack.MyClass");
|
||||
assertSameElements(packModules, otherModules.get(0));
|
||||
}
|
||||
|
||||
private List<Module> configureTwoMoreModules() {
|
||||
final List<Module> newModules = ContainerUtil.newArrayList();
|
||||
ApplicationManager.getApplication().runWriteAction(() -> {
|
||||
ModifiableModuleModel modifiableModel = ModuleManager.getInstance(getProject()).getModifiableModel();
|
||||
Module module2 = modifiableModel.newModule("a.iml", StdModuleTypes.JAVA.getId());
|
||||
newModules.add(module2);
|
||||
ModuleRootModificationUtil.addDependency(module2, getModule());
|
||||
File repoLib = new File(PathManagerEx.getTestDataPath(), "/psi/cls/repo/");
|
||||
VirtualFile repoRoot = LocalFileSystem.getInstance().findFileByIoFile(repoLib);
|
||||
assertNotNull(repoRoot);
|
||||
ModuleRootModificationUtil.addModuleLibrary(module2, repoRoot.getUrl());
|
||||
newModules.add(modifiableModel.newModule("b.iml", StdModuleTypes.JAVA.getId()));
|
||||
modifiableModel.commit();
|
||||
});
|
||||
return newModules;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user