Create separate scope for seaching sources in libraries

Fix build: avoid situation when GlobalSearchScope.contains() returns false for files
under both class root and source root.
This commit is contained in:
Nikolay Krasko
2014-06-09 21:30:39 +04:00
parent 7e22823652
commit 4ac626c1f2
@@ -19,7 +19,6 @@ package org.jetbrains.jet.plugin.libraries;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellij.openapi.module.Module; import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.impl.scopes.LibraryScopeBase;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.*;
import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Condition;
@@ -31,7 +30,6 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StringStubIndexExtension;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashSet; import gnu.trove.THashSet;
import kotlin.KotlinPackage; import kotlin.KotlinPackage;
@@ -65,7 +63,10 @@ import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex;
import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex;
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex;
import java.util.*; import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import static org.jetbrains.jet.plugin.libraries.MemberMatching.*; import static org.jetbrains.jet.plugin.libraries.MemberMatching.*;
@@ -117,12 +118,11 @@ public class JetSourceNavigationHelper {
Set<VirtualFile> sourceRootSet = Sets.newLinkedHashSet(); Set<VirtualFile> sourceRootSet = Sets.newLinkedHashSet();
for (OrderEntry entry : projectFileIndex.getOrderEntriesForFile(libraryFile)) { for (OrderEntry entry : projectFileIndex.getOrderEntriesForFile(libraryFile)) {
if (entry instanceof LibraryOrSdkOrderEntry) { if (entry instanceof LibraryOrSdkOrderEntry) {
VirtualFile[] sourceRoots = ((LibraryOrSdkOrderEntry) entry).getRootFiles(OrderRootType.SOURCES); KotlinPackage.addAll(sourceRootSet, entry.getFiles(OrderRootType.SOURCES));
KotlinPackage.addAll(sourceRootSet, sourceRoots);
} }
} }
return new LibraryScopeBaseFix(project, VirtualFile.EMPTY_ARRAY, ArrayUtil.toObjectArray(sourceRootSet, VirtualFile.class)); return new LibrarySourcesScope(project, sourceRootSet);
} }
private static List<JetFile> getContainingFiles(@NotNull Iterable<JetNamedDeclaration> declarations) { private static List<JetFile> getContainingFiles(@NotNull Iterable<JetNamedDeclaration> declarations) {
@@ -441,22 +441,38 @@ public class JetSourceNavigationHelper {
} }
} }
// TODO: Drop and use LibraryScopeBase after bug in LibraryScopeBase.getFileRoot() is fixed private static class LibrarySourcesScope extends GlobalSearchScope {
static class LibraryScopeBaseFix extends LibraryScopeBase { private final Set<VirtualFile> sources;
public LibraryScopeBaseFix(Project project, VirtualFile[] classes, VirtualFile[] sources) { private final ProjectFileIndex fileIndex;
super(project, classes, sources);
public LibrarySourcesScope(Project project, Set<VirtualFile> sources) {
super(project);
fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
this.sources = sources;
} }
@Override @Override
@Nullable public boolean contains(@NotNull VirtualFile file) {
protected VirtualFile getFileRoot(@NotNull VirtualFile file) { if (fileIndex.isInLibrarySource(file)) {
if (myIndex.isInLibraryClasses(file)) { return sources.contains(fileIndex.getSourceRootForFile(file));
return myIndex.getClassRootForFile(file);
} }
if (myIndex.isInLibrarySource(file)) { return false;
return myIndex.getSourceRootForFile(file); }
}
return null; @Override
public int compare(@NotNull VirtualFile file1, @NotNull VirtualFile file2) {
return 0;
}
@Override
public boolean isSearchInModuleContent(@NotNull Module aModule) {
return false;
}
@Override
public boolean isSearchInLibraries() {
return true;
} }
} }
} }