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.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,
|
||||||
|
|||||||
Reference in New Issue
Block a user