[debugger] avoid scanning all classes in vm for nested sub classes - fixed kotlin tests

GitOrigin-RevId: e5fee6bd9579af0282e24bbba80a1054f7a083b9
This commit is contained in:
Egor Ushakov
2024-10-04 10:48:22 +00:00
committed by intellij-monorepo-bot
parent 87b49d65b2
commit 0a33108740
2 changed files with 8 additions and 10 deletions
@@ -133,7 +133,8 @@ public class VirtualMachineProxyImpl implements JdiTimer, VirtualMachineProxy {
/**
* Check {@link ReferenceTypeImpl#nestedTypes()}
*/
private static void addNestedTypes(ReferenceType base, Collection<ReferenceType> classes, Set<ReferenceType> nested) {
@ApiStatus.Internal
public static void addNestedTypes(ReferenceType base, Collection<ReferenceType> classes, Collection<ReferenceType> nested) {
String baseName = base.name();
int baseLength = baseName.length();
classes.forEach(type -> {
@@ -3,6 +3,7 @@
package org.jetbrains.kotlin.idea.debugger.test.mock
import com.intellij.debugger.engine.DebugProcess.JAVA_STRATUM
import com.intellij.debugger.jdi.VirtualMachineProxyImpl
import com.sun.jdi.*
import org.jetbrains.kotlin.backend.common.output.OutputFile
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection
@@ -21,12 +22,12 @@ class SmartMockReferenceTypeContext(outputFiles: List<OutputFile>) {
.filter { it.relativePath.endsWith(".class") }
.map { it.readClass() }
private val referenceTypes: List<ReferenceType> by lazy {
internal val referenceTypes: List<ReferenceType> by lazy {
classes.map { SmartMockReferenceType(it, this) }
}
val referenceTypesByName by lazy {
referenceTypes.map { Pair(it.name(), it) }.toMap()
referenceTypes.associate { Pair(it.name(), it) }
}
}
@@ -60,17 +61,13 @@ class SmartMockReferenceType(val classNode: ClassNode, private val context: Smar
override fun sourceNames(stratum: String) = listOf(classNode.sourceFile)
override fun availableStrata() = emptyList<String>()
override fun toString(): String = name()
private val methodsCached by lazy { classNode.methods.map { MockMethod(it, this) } }
override fun methods() = methodsCached
override fun nestedTypes(): List<ReferenceType> {
val fromInnerClasses = classNode.innerClasses
.filter { it.outerName == classNode.name }
.mapNotNull { context.classes.find { c -> it.name == c.name } }
val fromOuterClasses = context.classes.filter { it.outerClass == classNode.name }
return (fromInnerClasses + fromOuterClasses).distinctBy { it.name }.map { SmartMockReferenceType(it, context) }
return mutableListOf<ReferenceType>().also { VirtualMachineProxyImpl.addNestedTypes(this, context.referenceTypes, it) }
}
override fun isPackagePrivate(): Boolean {