Remove creating too long chain of scopes for searching Kotlin source file
This commit is contained in:
@@ -19,11 +19,9 @@ 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.OrderEntry;
|
import com.intellij.openapi.roots.*;
|
||||||
import com.intellij.openapi.roots.OrderRootType;
|
|
||||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
|
||||||
import com.intellij.openapi.roots.ProjectRootManager;
|
|
||||||
import com.intellij.openapi.util.Condition;
|
import com.intellij.openapi.util.Condition;
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
import com.intellij.psi.JavaPsiFacade;
|
import com.intellij.psi.JavaPsiFacade;
|
||||||
@@ -31,11 +29,12 @@ import com.intellij.psi.PsiClass;
|
|||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
import com.intellij.psi.search.GlobalSearchScope;
|
import com.intellij.psi.search.GlobalSearchScope;
|
||||||
import com.intellij.psi.search.GlobalSearchScopesCore;
|
|
||||||
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 org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.annotations.TestOnly;
|
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.JetTopLevelFunctionsFqnNameIndex;
|
||||||
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex;
|
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
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.*;
|
||||||
|
|
||||||
@@ -114,13 +110,19 @@ public class JetSourceNavigationHelper {
|
|||||||
Project project = decompiledDeclaration.getProject();
|
Project project = decompiledDeclaration.getProject();
|
||||||
ProjectFileIndex projectFileIndex = ProjectFileIndex.SERVICE.getInstance(project);
|
ProjectFileIndex projectFileIndex = ProjectFileIndex.SERVICE.getInstance(project);
|
||||||
|
|
||||||
GlobalSearchScope resultScope = GlobalSearchScope.EMPTY_SCOPE;
|
if (!projectFileIndex.isInLibraryClasses(libraryFile)) {
|
||||||
for (OrderEntry orderEntry : projectFileIndex.getOrderEntriesForFile(libraryFile)) {
|
return GlobalSearchScope.EMPTY_SCOPE;
|
||||||
for (VirtualFile sourceDir : orderEntry.getFiles(OrderRootType.SOURCES)) {
|
}
|
||||||
resultScope = resultScope.uniteWith(GlobalSearchScopesCore.directoryScope(project, sourceDir, true));
|
|
||||||
|
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) {
|
private static List<JetFile> getContainingFiles(@NotNull Iterable<JetNamedDeclaration> declarations) {
|
||||||
@@ -438,4 +440,23 @@ public class JetSourceNavigationHelper {
|
|||||||
return getSourceClassOrObject(klass);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user