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.jvm.JvmClassName
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import com.intellij.util.indexing.FileBasedIndex
private val LOG = Logger.getInstance("org.jetbrains.kotlin.idea.debugger") 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) JdkScope(project, libraryEntry as JdkOrderEntry)
} }
val packagePartFiles = FilenameIndex.getAllFilesByExt(project, "class", scope) val packagePartFiles = FilenameIndex.getAllFilenames(project).stream().filter {
.filter { it.getName().startsWith(packagePartNameWoHash) } it.startsWith(packagePartNameWoHash) && it.endsWith(".class")
.map { }.flatMap {
FilenameIndex.getVirtualFilesByName(project, it, scope).stream()
}.map {
val packageFqName = file.getPackageFqName() val packageFqName = file.getPackageFqName()
if (packageFqName.isRoot()) { if (packageFqName.isRoot()) {
it.getNameWithoutExtension() it.getNameWithoutExtension()
@@ -125,7 +128,7 @@ private fun findPackagePartFileNamesForElement(elementAt: JetElement): List<Stri
"${packageFqName.asString()}.${it.getNameWithoutExtension()}" "${packageFqName.asString()}.${it.getNameWithoutExtension()}"
} }
} }
return packagePartFiles return packagePartFiles.toList()
} }
private fun render(desc: DeclarationDescriptor) = DescriptorRenderer.FQ_NAMES_IN_TYPES.render(desc) 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.annotations.Nullable;
import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils; import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils;
import org.jetbrains.kotlin.idea.debugger.DebuggerPackage; 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.load.kotlin.PackagePartClassUtils;
import org.jetbrains.kotlin.psi.JetElement; import org.jetbrains.kotlin.psi.JetElement;
import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetFile;
@@ -63,12 +64,16 @@ public class DebuggerUtils {
return filesWithExactName.iterator().next(); return filesWithExactName.iterator().next();
} }
if (!isPackagePartClassName(className)) {
return filesWithExactName.iterator().next();
}
JetFile file = getFileForPackagePartPrefixedName(filesWithExactName, className.getInternalName()); JetFile file = getFileForPackagePartPrefixedName(filesWithExactName, className.getInternalName());
if (file != null) { if (file != null) {
return file; return file;
} }
boolean isInLibrary = KotlinPackage.any(filesWithExactName, new Function1<JetFile, Boolean>() { boolean isInLibrary = KotlinPackage.all(filesWithExactName, new Function1<JetFile, Boolean>() {
@Override @Override
public Boolean invoke(JetFile file) { public Boolean invoke(JetFile file) {
return LibraryUtil.findLibraryEntry(file.getVirtualFile(), file.getProject()) != null; return LibraryUtil.findLibraryEntry(file.getVirtualFile(), file.getProject()) != null;
@@ -91,6 +96,11 @@ public class DebuggerUtils {
return null; return null;
} }
private static boolean isPackagePartClassName(JvmClassName className) {
String packageName = className.getPackageFqName().asString().replaceAll("\\.", "/");
return className.getInternalName().startsWith(packageName + "/" + PackageClassUtils.getPackageClassName(className.getPackageFqName()));
}
@Nullable @Nullable
private static JetFile getFileForPackagePartPrefixedName( private static JetFile getFileForPackagePartPrefixedName(
@NotNull Collection<JetFile> allPackageFiles, @NotNull Collection<JetFile> allPackageFiles,