From 4a0e7489dd3f43ef05ea7696ab1b28e5cc206d94 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 19 Jan 2015 16:13:34 +0300 Subject: [PATCH] Remove all unused code from JavaPsiFacadeImpl --- .../kotlin/resolve/jvm/JavaPsiFacadeImpl.java | 365 +----------------- .../resolve/jvm/KotlinJavaPsiFacade.java | 27 +- 2 files changed, 22 insertions(+), 370 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JavaPsiFacadeImpl.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JavaPsiFacadeImpl.java index aba7c499011..34cb4c67dab 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JavaPsiFacadeImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JavaPsiFacadeImpl.java @@ -16,90 +16,33 @@ package org.jetbrains.kotlin.resolve.jvm; -import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.ReadActionProcessor; import com.intellij.openapi.progress.ProgressIndicatorProvider; -import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.FileIndexFacade; -import com.intellij.openapi.roots.PackageIndex; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileFilter; -import com.intellij.psi.*; -import com.intellij.psi.impl.JavaPsiFacadeEx; -import com.intellij.psi.impl.PsiConstantEvaluationHelperImpl; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.file.impl.JavaFileManager; -import com.intellij.psi.impl.source.DummyHolderFactory; -import com.intellij.psi.impl.source.JavaDummyHolder; -import com.intellij.psi.impl.source.JavaDummyHolderFactory; -import com.intellij.psi.impl.source.resolve.FileContextUtil; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElementFinder; +import com.intellij.psi.PsiPackage; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.stubs.StubTreeLoader; -import com.intellij.psi.util.PsiModificationTracker; -import com.intellij.psi.util.PsiUtilCore; import com.intellij.reference.SoftReference; import com.intellij.util.ConcurrencyUtil; -import com.intellij.util.Processor; -import com.intellij.util.SmartList; import com.intellij.util.containers.ConcurrentHashMap; -import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.HashMap; -import com.intellij.util.messages.MessageBus; -import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.TestOnly; -import java.util.*; +import java.util.Arrays; +import java.util.List; import java.util.concurrent.ConcurrentMap; -/** - * Copy idea version of JavaPsiFacadeImpl - * TODO Temporary class until {@link com.intellij.psi.impl.JavaPsiFacadeImpl} hacked. - * @see com.intellij.psi.impl.JavaPsiFacadeImpl - */ -@SuppressWarnings({"UnnecessaryFinalOnLocalVariableOrParameter", "UnusedDeclaration", "NullableProblems"}) -public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { +public abstract class JavaPsiFacadeImpl { private volatile PsiElementFinder[] myElementFinders; - private final PsiConstantEvaluationHelper myConstantEvaluationHelper; private volatile SoftReference> myPackageCache; private final Project myProject; - private final JavaFileManager myFileManager; - public JavaPsiFacadeImpl(Project project, - PsiManager psiManager, - JavaFileManager javaFileManager, - MessageBus bus) { + public JavaPsiFacadeImpl(Project project) { myProject = project; - myFileManager = javaFileManager; - myConstantEvaluationHelper = new PsiConstantEvaluationHelperImpl(); - - final PsiModificationTracker modificationTracker = psiManager.getModificationTracker(); - - if (bus != null) { - bus.connect().subscribe(PsiModificationTracker.TOPIC, new PsiModificationTracker.Listener() { - private long lastTimeSeen = -1L; - - @Override - public void modificationCountChanged() { - final long now = modificationTracker.getJavaStructureModificationCount(); - if (lastTimeSeen != now) { - lastTimeSeen = now; - myPackageCache = null; - } - } - }); - } - - DummyHolderFactory.setFactory(new JavaDummyHolderFactory()); } - @Override - public PsiClass findClass(@NotNull final String qualifiedName, @NotNull GlobalSearchScope scope) { + public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { ProgressIndicatorProvider.checkCanceled(); // We hope this method is being called often enough to cancel daemon processes smoothly if (DumbService.getInstance(getProject()).isDumb()) { @@ -120,9 +63,9 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { @NotNull private PsiClass[] findClassesInDumbMode(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { - final String packageName = StringUtil.getPackageName(qualifiedName); - final PsiPackage pkg = findPackage(packageName); - final String className = StringUtil.getShortName(qualifiedName); + String packageName = StringUtil.getPackageName(qualifiedName); + PsiPackage pkg = findPackage(packageName); + String className = StringUtil.getShortName(qualifiedName); if (pkg == null && packageName.length() < qualifiedName.length()) { PsiClass[] containingClasses = findClassesInDumbMode(packageName, scope); if (containingClasses.length == 1) { @@ -139,22 +82,6 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return pkg.findClassByShortName(className, scope); } - @Override - @NotNull - public PsiClass[] findClasses(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { - if (DumbService.getInstance(getProject()).isDumb()) { - return findClassesInDumbMode(qualifiedName, scope); - } - - List classes = new SmartList(); - for (PsiElementFinder finder : finders()) { - PsiClass[] finderClasses = finder.findClasses(qualifiedName, scope); - ContainerUtil.addAll(classes, finderClasses); - } - - return classes.toArray(new PsiClass[classes.size()]); - } - @NotNull private PsiElementFinder[] finders() { PsiElementFinder[] answer = myElementFinders; @@ -167,20 +94,8 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { } @NotNull - protected PsiElementFinder[] calcFinders() { - List elementFinders = new ArrayList(); - elementFinders.add(new PsiElementFinderImpl()); - ContainerUtil.addAll(elementFinders, myProject.getExtensions(PsiElementFinder.EP_NAME)); - return elementFinders.toArray(new PsiElementFinder[elementFinders.size()]); - } + protected abstract PsiElementFinder[] calcFinders(); - @Override - @NotNull - public PsiConstantEvaluationHelper getConstantEvaluationHelper() { - return myConstantEvaluationHelper; - } - - @Override public PsiPackage findPackage(@NotNull String qualifiedName) { ConcurrentMap cache = SoftReference.dereference(myPackageCache); if (cache == null) { @@ -213,264 +128,8 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return finders; } - @Override - @NotNull - public PsiJavaParserFacade getParserFacade() { - return getElementFactory(); // TODO: lighter implementation which doesn't mark all the elements as generated. - } - - @Override - @NotNull - public PsiResolveHelper getResolveHelper() { - return PsiResolveHelper.SERVICE.getInstance(myProject); - } - - @Override - @NotNull - public PsiNameHelper getNameHelper() { - return PsiNameHelper.getInstance(myProject); - } - - @NotNull - public Set getClassNames(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { - Set result = new THashSet(); - for (PsiElementFinder finder : filteredFinders()) { - result.addAll(finder.getClassNames(psiPackage, scope)); - } - return result; - } - - @NotNull - public PsiClass[] getClasses(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { - List result = null; - for (PsiElementFinder finder : filteredFinders()) { - PsiClass[] classes = finder.getClasses(psiPackage, scope); - if (classes.length == 0) continue; - if (result == null) result = new ArrayList(); - ContainerUtil.addAll(result, classes); - } - - return result == null ? PsiClass.EMPTY_ARRAY : result.toArray(new PsiClass[result.size()]); - } - - public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, - @NotNull GlobalSearchScope scope, - @NotNull Processor consumer, - boolean includeLibrarySources) { - for (PsiElementFinder finder : filteredFinders()) { - if (!finder.processPackageDirectories(psiPackage, scope, consumer, includeLibrarySources)) { - return false; - } - } - return true; - } - - @NotNull - public PsiPackage[] getSubPackages(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { - LinkedHashSet result = new LinkedHashSet(); - for (PsiElementFinder finder : filteredFinders()) { - PsiPackage[] packages = finder.getSubPackages(psiPackage, scope); - ContainerUtil.addAll(result, packages); - } - - return result.toArray(new PsiPackage[result.size()]); - } - - public PsiClass[] findClassByShortName(String name, PsiPackage psiPackage, GlobalSearchScope scope) { - List result = null; - for (PsiElementFinder finder : filteredFinders()) { - PsiClass[] classes = finder.getClasses(name, psiPackage, scope); - if (classes.length == 0) continue; - if (result == null) result = new ArrayList(); - ContainerUtil.addAll(result, classes); - } - - return result == null ? PsiClass.EMPTY_ARRAY : result.toArray(new PsiClass[result.size()]); - } - - private class PsiElementFinderImpl extends PsiElementFinder implements DumbAware { - @Override - public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { - return myFileManager.findClass(qualifiedName, scope); - } - - @Override - @NotNull - public PsiClass[] findClasses(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { - return myFileManager.findClasses(qualifiedName, scope); - } - - @Override - public PsiPackage findPackage(@NotNull String qualifiedName) { - return myFileManager.findPackage(qualifiedName); - } - - @Override - @NotNull - public PsiPackage[] getSubPackages(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { - final Map packagesMap = new HashMap(); - final String qualifiedName = psiPackage.getQualifiedName(); - for (PsiDirectory dir : psiPackage.getDirectories(scope)) { - PsiDirectory[] subDirs = dir.getSubdirectories(); - for (PsiDirectory subDir : subDirs) { - final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(subDir); - if (aPackage != null) { - final String subQualifiedName = aPackage.getQualifiedName(); - if (subQualifiedName.startsWith(qualifiedName) && !packagesMap.containsKey(subQualifiedName)) { - packagesMap.put(aPackage.getQualifiedName(), aPackage); - } - } - } - } - - packagesMap.remove(qualifiedName); // avoid SOE caused by returning a package as a subpackage of itself - return packagesMap.values().toArray(new PsiPackage[packagesMap.size()]); - } - - @Override - @NotNull - public PsiClass[] getClasses(@NotNull PsiPackage psiPackage, @NotNull final GlobalSearchScope scope) { - return getClasses(null, psiPackage, scope); - } - - @Override - @NotNull - public PsiClass[] getClasses(@Nullable String shortName, @NotNull PsiPackage psiPackage, @NotNull final GlobalSearchScope scope) { - List list = null; - String packageName = psiPackage.getQualifiedName(); - for (PsiDirectory dir : psiPackage.getDirectories(scope)) { - PsiClass[] classes = JavaDirectoryService.getInstance().getClasses(dir); - if (classes.length == 0) continue; - if (list == null) list = new ArrayList(); - for (PsiClass aClass : classes) { - // class file can be located in wrong place inside file system - String qualifiedName = aClass.getQualifiedName(); - if (qualifiedName != null) qualifiedName = StringUtil.getPackageName(qualifiedName); - if (Comparing.strEqual(qualifiedName, packageName)) { - if (shortName == null || shortName.equals(aClass.getName())) list.add(aClass); - } - } - } - if (list == null) { - return PsiClass.EMPTY_ARRAY; - } - - if (list.size() > 1) { - ContainerUtil.quickSort(list, new Comparator() { - @Override - public int compare(PsiClass o1, PsiClass o2) { - VirtualFile file1 = PsiUtilCore.getVirtualFile(o1); - VirtualFile file2 = PsiUtilCore.getVirtualFile(o2); - return file1 == null ? file2 == null ? 0 : -1 : file2 == null ? 1 : scope.compare(file2, file1); - } - }); - } - - return list.toArray(new PsiClass[list.size()]); - } - - @NotNull - @Override - public Set getClassNames(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { - Set names = null; - FileIndexFacade facade = FileIndexFacade.getInstance(myProject); - for (PsiDirectory dir : psiPackage.getDirectories(scope)) { - for (PsiFile file : dir.getFiles()) { - if (file instanceof PsiClassOwner && file.getViewProvider().getLanguages().size() == 1) { - VirtualFile vFile = file.getVirtualFile(); - if (vFile != null && - !(file instanceof PsiCompiledElement) && - !facade.isInSourceContent(vFile) && - (!scope.isForceSearchingInLibrarySources() || - !StubTreeLoader.getInstance().canHaveStub(vFile))) { - continue; - } - - Set inFile = file instanceof PsiClassOwnerEx ? ((PsiClassOwnerEx)file).getClassNames() : getClassNames(((PsiClassOwner)file).getClasses()); - - if (inFile.isEmpty()) continue; - if (names == null) names = new HashSet(); - names.addAll(inFile); - } - } - - } - return names == null ? Collections.emptySet() : names; - } - - @Override - public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, - @NotNull final GlobalSearchScope scope, - @NotNull final Processor consumer, - boolean includeLibrarySources) { - final PsiManager psiManager = PsiManager.getInstance(getProject()); - return PackageIndex.getInstance(getProject()).getDirsByPackageName(psiPackage.getQualifiedName(), includeLibrarySources) - .forEach(new ReadActionProcessor() { - @Override - public boolean processInReadAction(final VirtualFile dir) { - if (!scope.contains(dir)) return true; - PsiDirectory psiDir = psiManager.findDirectory(dir); - return psiDir == null || consumer.process(psiDir); - } - }); - } - } - - @Override - public boolean isPartOfPackagePrefix(@NotNull String packageName) { - final Collection packagePrefixes = myFileManager.getNonTrivialPackagePrefixes(); - for (final String subpackageName : packagePrefixes) { - if (PsiNameHelper.isSubpackageOf(subpackageName, packageName)) return true; - } - return false; - } - - @Override - public boolean isInPackage(@NotNull PsiElement element, @NotNull PsiPackage aPackage) { - final PsiFile file = FileContextUtil.getContextFile(element); - if (file instanceof JavaDummyHolder) { - return ((JavaDummyHolder) file).isInPackage(aPackage); - } - if (file instanceof PsiJavaFile) { - final String packageName = ((PsiJavaFile) file).getPackageName(); - return packageName.equals(aPackage.getQualifiedName()); - } - return false; - } - - @Override - public boolean arePackagesTheSame(@NotNull PsiElement element1, @NotNull PsiElement element2) { - PsiFile file1 = FileContextUtil.getContextFile(element1); - PsiFile file2 = FileContextUtil.getContextFile(element2); - if (Comparing.equal(file1, file2)) return true; - if (file1 instanceof JavaDummyHolder && file2 instanceof JavaDummyHolder) return true; - if (file1 instanceof JavaDummyHolder || file2 instanceof JavaDummyHolder) { - JavaDummyHolder dummyHolder = (JavaDummyHolder) (file1 instanceof JavaDummyHolder ? file1 : file2); - PsiElement other = file1 instanceof JavaDummyHolder ? file2 : file1; - return dummyHolder.isSamePackage(other); - } - if (!(file1 instanceof PsiClassOwner)) return false; - if (!(file2 instanceof PsiClassOwner)) return false; - String package1 = ((PsiClassOwner) file1).getPackageName(); - String package2 = ((PsiClassOwner) file2).getPackageName(); - return Comparing.equal(package1, package2); - } - - @Override @NotNull public Project getProject() { return myProject; } - - @Override - @NotNull - public PsiElementFactory getElementFactory() { - return PsiElementFactory.SERVICE.getInstance(myProject); - } - - @TestOnly - @Override - public void setAssertOnFileLoadingFilter(@NotNull final VirtualFileFilter filter, Disposable parentDisposable) { - ((PsiManagerImpl)PsiManager.getInstance(myProject)).setAssertOnFileLoadingFilter(filter, parentDisposable); - } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java index 37b51aa58a9..2c959e801f4 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java @@ -29,6 +29,7 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; import com.intellij.util.Query; +import com.intellij.util.containers.ContainerUtil; import kotlin.Function1; import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; @@ -57,31 +58,23 @@ public class KotlinJavaPsiFacade { private final GlobalSearchScope searchScope; public KotlinJavaPsiFacadeWrapper(Project project, GlobalSearchScope searchScope) { - super(project, PsiManager.getInstance(project), findJavaFileManager(project), null); + super(project); this.searchScope = searchScope; } @NotNull @Override protected PsiElementFinder[] calcFinders() { - List filteredBaseFinders = KotlinPackage.filter( - super.calcFinders(), new Function1() { - @Override - public Boolean invoke(PsiElementFinder finder) { - if (finder instanceof KotlinFinderMarker) return false; - - if (finder.getClass().getName().equals("org.jetbrains.kotlin.resolve.jvm.JavaPsiFacadeImpl$PsiElementFinderImpl")) { - // TODO: Replace with instanceof check in idea 14 - return false; - } - - return true; - } - }); - List elementFinders = new ArrayList(); elementFinders.add(new KotlinPsiElementFinderImpl(getProject(), searchScope)); - elementFinders.addAll(filteredBaseFinders); + + ContainerUtil.addAll(elementFinders, KotlinPackage.filter( + getProject().getExtensions(PsiElementFinder.EP_NAME), new Function1() { + @Override + public Boolean invoke(PsiElementFinder finder) { + return !(finder instanceof KotlinFinderMarker); + } + })); return elementFinders.toArray(new PsiElementFinder[elementFinders.size()]); }