Optimize search of package part files for JetPositionManager
This commit is contained in:
+7
-4
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user