mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-18 20:41:22 +07:00
IDEA-91585 IDEA-57990 resolve inside Android SDK based on its sources, not classes
This commit is contained in:
@@ -34,6 +34,7 @@ import com.intellij.psi.impl.source.JavaDummyHolderFactory;
|
||||
import com.intellij.psi.impl.source.resolve.FileContextUtil;
|
||||
import com.intellij.psi.impl.source.tree.JavaElementType;
|
||||
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;
|
||||
@@ -249,9 +250,12 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx {
|
||||
return result == null ? PsiClass.EMPTY_ARRAY : result.toArray(new PsiClass[result.size()]);
|
||||
}
|
||||
|
||||
public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope, @NotNull Processor<PsiDirectory> consumer) {
|
||||
public boolean processPackageDirectories(@NotNull PsiPackage psiPackage,
|
||||
@NotNull GlobalSearchScope scope,
|
||||
@NotNull Processor<PsiDirectory> consumer,
|
||||
boolean includeLibrarySources) {
|
||||
for (PsiElementFinder finder : filteredFinders()) {
|
||||
if (!finder.processPackageDirectories(psiPackage, scope, consumer)) {
|
||||
if (!finder.processPackageDirectories(psiPackage, scope, consumer, includeLibrarySources)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -371,7 +375,11 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx {
|
||||
for (PsiFile file : dir.getFiles()) {
|
||||
if (file instanceof PsiClassOwner && file.getViewProvider().getLanguages().size() == 1) {
|
||||
VirtualFile vFile = file.getVirtualFile();
|
||||
if (vFile != null && !facade.isInSourceContent(vFile) && !(file instanceof PsiCompiledElement)) {
|
||||
if (vFile != null &&
|
||||
!(file instanceof PsiCompiledElement) &&
|
||||
!facade.isInSourceContent(vFile) &&
|
||||
(!scope.isForceSearchingInLibrarySources() ||
|
||||
!StubTreeLoader.getInstance().canHaveStub(vFile))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -388,16 +396,20 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, @NotNull final GlobalSearchScope scope, @NotNull final Processor<PsiDirectory> consumer) {
|
||||
public boolean processPackageDirectories(@NotNull PsiPackage psiPackage,
|
||||
@NotNull final GlobalSearchScope scope,
|
||||
@NotNull final Processor<PsiDirectory> consumer,
|
||||
boolean includeLibrarySources) {
|
||||
final PsiManager psiManager = PsiManager.getInstance(getProject());
|
||||
return PackageIndex.getInstance(getProject()).getDirsByPackageName(psiPackage.getQualifiedName(), false).forEach(new ReadActionProcessor<VirtualFile>() {
|
||||
@Override
|
||||
public boolean processInReadAction(final VirtualFile dir) {
|
||||
if (!scope.contains(dir)) return true;
|
||||
PsiDirectory psiDir = psiManager.findDirectory(dir);
|
||||
return psiDir == null || consumer.process(psiDir);
|
||||
}
|
||||
});
|
||||
return PackageIndex.getInstance(getProject()).getDirsByPackageName(psiPackage.getQualifiedName(), includeLibrarySources)
|
||||
.forEach(new ReadActionProcessor<VirtualFile>() {
|
||||
@Override
|
||||
public boolean processInReadAction(final VirtualFile dir) {
|
||||
if (!scope.contains(dir)) return true;
|
||||
PsiDirectory psiDir = psiManager.findDirectory(dir);
|
||||
return psiDir == null || consumer.process(psiDir);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ import com.intellij.psi.impl.source.tree.java.PsiCompositeModifierList;
|
||||
import com.intellij.psi.scope.ElementClassHint;
|
||||
import com.intellij.psi.scope.NameHint;
|
||||
import com.intellij.psi.scope.PsiScopeProcessor;
|
||||
import com.intellij.psi.search.DelegatingGlobalSearchScope;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.util.*;
|
||||
import com.intellij.reference.SoftReference;
|
||||
@@ -47,6 +48,7 @@ public class PsiPackageImpl extends PsiPackageBase implements PsiPackage, Querya
|
||||
public static boolean DEBUG = false;
|
||||
private volatile CachedValue<PsiModifierList> myAnnotationList;
|
||||
private volatile CachedValue<Collection<PsiDirectory>> myDirectories;
|
||||
private volatile CachedValue<Collection<PsiDirectory>> myDirectoriesWithLibSources;
|
||||
private volatile SoftReference<Set<String>> myPublicClassNamesCache;
|
||||
|
||||
public PsiPackageImpl(PsiManager manager, String qualifiedName) {
|
||||
@@ -54,19 +56,31 @@ public class PsiPackageImpl extends PsiPackageBase implements PsiPackage, Querya
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Collection<PsiDirectory> getAllDirectories() {
|
||||
if (myDirectories == null) {
|
||||
myDirectories = CachedValuesManager.getManager(myManager.getProject()).createCachedValue(new CachedValueProvider<Collection<PsiDirectory>>() {
|
||||
@Override
|
||||
public Result<Collection<PsiDirectory>> compute() {
|
||||
final CommonProcessors.CollectProcessor<PsiDirectory> processor = new CommonProcessors.CollectProcessor<PsiDirectory>();
|
||||
getFacade().processPackageDirectories(PsiPackageImpl.this, allScope(), processor);
|
||||
return Result.create(processor.getResults(), PsiPackageImplementationHelper.getInstance().getDirectoryCachedValueDependencies(
|
||||
PsiPackageImpl.this));
|
||||
}
|
||||
}, false);
|
||||
protected Collection<PsiDirectory> getAllDirectories(boolean includeLibrarySources) {
|
||||
if (includeLibrarySources) {
|
||||
if (myDirectoriesWithLibSources == null) {
|
||||
myDirectoriesWithLibSources = createCachedDirectories(true);
|
||||
}
|
||||
return myDirectoriesWithLibSources.getValue();
|
||||
}
|
||||
return myDirectories.getValue();
|
||||
else {
|
||||
if (myDirectories == null) {
|
||||
myDirectories = createCachedDirectories(false);
|
||||
}
|
||||
return myDirectories.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
private CachedValue<Collection<PsiDirectory>> createCachedDirectories(final boolean includeLibrarySources) {
|
||||
return CachedValuesManager.getManager(myManager.getProject()).createCachedValue(new CachedValueProvider<Collection<PsiDirectory>>() {
|
||||
@Override
|
||||
public Result<Collection<PsiDirectory>> compute() {
|
||||
final CommonProcessors.CollectProcessor<PsiDirectory> processor = new CommonProcessors.CollectProcessor<PsiDirectory>();
|
||||
getFacade().processPackageDirectories(PsiPackageImpl.this, allScope(), processor, includeLibrarySources);
|
||||
return Result.create(processor.getResults(), PsiPackageImplementationHelper.getInstance().getDirectoryCachedValueDependencies(
|
||||
PsiPackageImpl.this));
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -103,7 +117,7 @@ public class PsiPackageImpl extends PsiPackageBase implements PsiPackage, Querya
|
||||
|
||||
@Override
|
||||
public boolean isValid() {
|
||||
return PsiPackageImplementationHelper.getInstance().packagePrefixExists(this) || !getAllDirectories().isEmpty();
|
||||
return PsiPackageImplementationHelper.getInstance().packagePrefixExists(this) || !getAllDirectories(true).isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -165,7 +179,17 @@ public class PsiPackageImpl extends PsiPackageBase implements PsiPackage, Querya
|
||||
SoftReference<Set<String>> ref = myPublicClassNamesCache;
|
||||
Set<String> cache = ref == null ? null : ref.get();
|
||||
if (cache == null) {
|
||||
cache = getFacade().getClassNames(this, allScope());
|
||||
GlobalSearchScope scope = allScope();
|
||||
|
||||
if (!scope.isForceSearchingInLibrarySources()) {
|
||||
scope = new DelegatingGlobalSearchScope(scope) {
|
||||
@Override
|
||||
public boolean isForceSearchingInLibrarySources() {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
cache = getFacade().getClassNames(this, scope);
|
||||
myPublicClassNamesCache = new SoftReference<Set<String>>(cache);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user