[by Jan Voung] speedup Groovy Console/Shell action update by not traversing all project modules searching for groovy classes

This commit is contained in:
peter
2015-11-26 11:10:34 +01:00
parent f3fd062d65
commit b7156505e7
9 changed files with 182 additions and 20 deletions
+2 -2
View File
@@ -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;
}
}