diff options
Diffstat (limited to 'java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java')
-rw-r--r-- | java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java index fb012672660d..287d43f4cf2d 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,12 @@ package com.intellij.psi.impl.search; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicatorProvider; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.java.stubs.index.JavaAnonymousClassBaseRefOccurenceIndex; import com.intellij.psi.impl.java.stubs.index.JavaSuperClassNameOccurenceIndex; import com.intellij.psi.search.EverythingGlobalScope; @@ -31,6 +31,7 @@ import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.AllClassesSearch; import com.intellij.psi.search.searches.DirectClassInheritorsSearch; import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; import com.intellij.util.containers.ContainerUtil; @@ -49,7 +50,6 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir @Override public boolean execute(@NotNull final DirectClassInheritorsSearch.SearchParameters p, @NotNull final Processor<PsiClass> consumer) { final PsiClass aClass = p.getClassToProcess(); - final PsiManagerImpl psiManager = (PsiManagerImpl)aClass.getManager(); final SearchScope useScope = ApplicationManager.getApplication().runReadAction(new Computable<SearchScope>() { @Override @@ -65,13 +65,13 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir } }); + final Project project = PsiUtilCore.getProjectInReadAction(aClass); if (CommonClassNames.JAVA_LANG_OBJECT.equals(qualifiedName)) { //[pasynkov]: WTF? //final SearchScope scope = useScope.intersectWith(GlobalSearchScope.notScope(GlobalSearchScope.getScopeRestrictedByFileTypes( // GlobalSearchScope.allScope(psiManager.getProject()), StdFileTypes.JSP, StdFileTypes.JSPX))); - final SearchScope scope = useScope; - return AllClassesSearch.search(scope, aClass.getProject()).forEach(new Processor<PsiClass>() { + return AllClassesSearch.search(useScope, project).forEach(new Processor<PsiClass>() { @Override public boolean process(final PsiClass psiClass) { if (psiClass.isInterface()) { @@ -90,7 +90,7 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir }); } - final GlobalSearchScope scope = useScope instanceof GlobalSearchScope ? (GlobalSearchScope)useScope : new EverythingGlobalScope(psiManager.getProject()); + final GlobalSearchScope scope = useScope instanceof GlobalSearchScope ? (GlobalSearchScope)useScope : new EverythingGlobalScope(project); final String searchKey = ApplicationManager.getApplication().runReadAction(new Computable<String>() { @Override public String compute() { @@ -104,15 +104,20 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir Collection<PsiReferenceList> candidates = ApplicationManager.getApplication().runReadAction(new Computable<Collection<PsiReferenceList>>() { @Override public Collection<PsiReferenceList> compute() { - return JavaSuperClassNameOccurenceIndex.getInstance().get(searchKey, psiManager.getProject(), scope); + return JavaSuperClassNameOccurenceIndex.getInstance().get(searchKey, project, scope); } }); Map<String, List<PsiClass>> classes = new HashMap<String, List<PsiClass>>(); - for (PsiReferenceList referenceList : candidates) { + for (final PsiReferenceList referenceList : candidates) { ProgressIndicatorProvider.checkCanceled(); - final PsiClass candidate = (PsiClass)referenceList.getParent(); + final PsiClass candidate = (PsiClass)ApplicationManager.getApplication().runReadAction(new Computable<PsiElement>() { + @Override + public PsiElement compute() { + return referenceList.getParent(); + } + }); if (!checkInheritance(p, aClass, candidate)) continue; String fqn = ApplicationManager.getApplication().runReadAction(new Computable<String>() { @@ -137,7 +142,7 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir Collection<PsiAnonymousClass> anonymousCandidates = ApplicationManager.getApplication().runReadAction(new Computable<Collection<PsiAnonymousClass>>() { @Override public Collection<PsiAnonymousClass> compute() { - return JavaAnonymousClassBaseRefOccurenceIndex.getInstance().get(searchKey, psiManager.getProject(), scope); + return JavaAnonymousClassBaseRefOccurenceIndex.getInstance().get(searchKey, project, scope); } }); @@ -148,7 +153,13 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir if (!consumer.process(candidate)) return false; } - if (aClass.isEnum()) { + boolean isEnum = ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { + @Override + public Boolean compute() { + return aClass.isEnum(); + } + }); + if (isEnum) { // abstract enum can be subclassed in the body PsiField[] fields = ApplicationManager.getApplication().runReadAction(new Computable<PsiField[]>() { @Override @@ -189,10 +200,10 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir // if there is a class from the same jar, prefer it boolean sameJarClassFound = false; - VirtualFile jarFile = PsiUtil.getJarFile(aClass); + VirtualFile jarFile = getJarFile(aClass); if (jarFile != null) { for (PsiClass sameNamedClass : sameNamedClasses) { - boolean fromSameJar = Comparing.equal(PsiUtil.getJarFile(sameNamedClass), jarFile); + boolean fromSameJar = Comparing.equal(getJarFile(sameNamedClass), jarFile); if (fromSameJar) { sameJarClassFound = true; if (!consumer.process(sameNamedClass)) return false; @@ -202,4 +213,13 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir return sameJarClassFound || ContainerUtil.process(sameNamedClasses, consumer); } + + private static VirtualFile getJarFile(final PsiClass aClass) { + return ApplicationManager.getApplication().runReadAction(new Computable<VirtualFile>() { + @Override + public VirtualFile compute() { + return PsiUtil.getJarFile(aClass); + } + }); + } } |