Optimize search of package part files for JetPositionManager

This commit is contained in:
Natalia Ukhorskaya
2015-02-05 14:44:11 +03:00
parent 360a496724
commit 1ab51a08aa
2 changed files with 18 additions and 5 deletions
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import com.intellij.util.indexing.FileBasedIndex
private val LOG = Logger.getInstance("org.jetbrains.kotlin.idea.debugger")
@@ -115,9 +116,11 @@ private fun findPackagePartFileNamesForElement(elementAt: JetElement): List<Stri
JdkScope(project, libraryEntry as JdkOrderEntry)
}
val packagePartFiles = FilenameIndex.getAllFilesByExt(project, "class", scope)
.filter { it.getName().startsWith(packagePartNameWoHash) }
.map {
val packagePartFiles = FilenameIndex.getAllFilenames(project).stream().filter {
it.startsWith(packagePartNameWoHash) && it.endsWith(".class")
}.flatMap {
FilenameIndex.getVirtualFilesByName(project, it, scope).stream()
}.map {
val packageFqName = file.getPackageFqName()
if (packageFqName.isRoot()) {
it.getNameWithoutExtension()
@@ -125,7 +128,7 @@ private fun findPackagePartFileNamesForElement(elementAt: JetElement): List<Stri
"${packageFqName.asString()}.${it.getNameWithoutExtension()}"
}
}
return packagePartFiles
return packagePartFiles.toList()
}
private fun render(desc: DeclarationDescriptor) = DescriptorRenderer.FQ_NAMES_IN_TYPES.render(desc)
@@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils;
import org.jetbrains.kotlin.idea.debugger.DebuggerPackage;
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils;
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils;
import org.jetbrains.kotlin.psi.JetElement;
import org.jetbrains.kotlin.psi.JetFile;
@@ -63,12 +64,16 @@ public class DebuggerUtils {
return filesWithExactName.iterator().next();
}
if (!isPackagePartClassName(className)) {
return filesWithExactName.iterator().next();
}
JetFile file = getFileForPackagePartPrefixedName(filesWithExactName, className.getInternalName());
if (file != null) {
return file;
}
boolean isInLibrary = KotlinPackage.any(filesWithExactName, new Function1<JetFile, Boolean>() {
boolean isInLibrary = KotlinPackage.all(filesWithExactName, new Function1<JetFile, Boolean>() {
@Override
public Boolean invoke(JetFile file) {
return LibraryUtil.findLibraryEntry(file.getVirtualFile(), file.getProject()) != null;
@@ -91,6 +96,11 @@ public class DebuggerUtils {
return null;
}
private static boolean isPackagePartClassName(JvmClassName className) {
String packageName = className.getPackageFqName().asString().replaceAll("\\.", "/");
return className.getInternalName().startsWith(packageName + "/" + PackageClassUtils.getPackageClassName(className.getPackageFqName()));
}
@Nullable
private static JetFile getFileForPackagePartPrefixedName(
@NotNull Collection<JetFile> allPackageFiles,