Remove creating too long chain of scopes for searching Kotlin source file

This commit is contained in:
Nikolay Krasko
2014-06-06 20:58:08 +04:00
parent 5ce8f4b892
commit 7e22823652
@@ -19,11 +19,9 @@ package org.jetbrains.jet.plugin.libraries;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.impl.scopes.LibraryScopeBase;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.JavaPsiFacade;
@@ -31,11 +29,12 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.GlobalSearchScopesCore;
import com.intellij.psi.stubs.StringStubIndexExtension;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashSet;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
@@ -66,10 +65,7 @@ import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex;
import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex;
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.*;
import static org.jetbrains.jet.plugin.libraries.MemberMatching.*;
@@ -114,13 +110,19 @@ public class JetSourceNavigationHelper {
Project project = decompiledDeclaration.getProject();
ProjectFileIndex projectFileIndex = ProjectFileIndex.SERVICE.getInstance(project);
GlobalSearchScope resultScope = GlobalSearchScope.EMPTY_SCOPE;
for (OrderEntry orderEntry : projectFileIndex.getOrderEntriesForFile(libraryFile)) {
for (VirtualFile sourceDir : orderEntry.getFiles(OrderRootType.SOURCES)) {
resultScope = resultScope.uniteWith(GlobalSearchScopesCore.directoryScope(project, sourceDir, true));
if (!projectFileIndex.isInLibraryClasses(libraryFile)) {
return GlobalSearchScope.EMPTY_SCOPE;
}
Set<VirtualFile> sourceRootSet = Sets.newLinkedHashSet();
for (OrderEntry entry : projectFileIndex.getOrderEntriesForFile(libraryFile)) {
if (entry instanceof LibraryOrSdkOrderEntry) {
VirtualFile[] sourceRoots = ((LibraryOrSdkOrderEntry) entry).getRootFiles(OrderRootType.SOURCES);
KotlinPackage.addAll(sourceRootSet, sourceRoots);
}
}
return resultScope;
return new LibraryScopeBaseFix(project, VirtualFile.EMPTY_ARRAY, ArrayUtil.toObjectArray(sourceRootSet, VirtualFile.class));
}
private static List<JetFile> getContainingFiles(@NotNull Iterable<JetNamedDeclaration> declarations) {
@@ -438,4 +440,23 @@ public class JetSourceNavigationHelper {
return getSourceClassOrObject(klass);
}
}
// TODO: Drop and use LibraryScopeBase after bug in LibraryScopeBase.getFileRoot() is fixed
static class LibraryScopeBaseFix extends LibraryScopeBase {
public LibraryScopeBaseFix(Project project, VirtualFile[] classes, VirtualFile[] sources) {
super(project, classes, sources);
}
@Override
@Nullable
protected VirtualFile getFileRoot(@NotNull VirtualFile file) {
if (myIndex.isInLibraryClasses(file)) {
return myIndex.getClassRootForFile(file);
}
if (myIndex.isInLibrarySource(file)) {
return myIndex.getSourceRootForFile(file);
}
return null;
}
}
}