IDEA-91585 IDEA-57990 resolve inside Android SDK based on its sources, not classes

This commit is contained in:
Eugene Kudelevsky
2013-07-18 15:56:05 +04:00
parent 7bd45a10d3
commit c1aa648965
13 changed files with 150 additions and 39 deletions

View File

@@ -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);
}
});
}
}

View File

@@ -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);
}