From 0a33108740a20d2d86a648316198d9255ed3f7a1 Mon Sep 17 00:00:00 2001 From: Egor Ushakov Date: Thu, 3 Oct 2024 12:53:42 +0200 Subject: [PATCH] [debugger] avoid scanning all classes in vm for nested sub classes - fixed kotlin tests GitOrigin-RevId: e5fee6bd9579af0282e24bbba80a1054f7a083b9 --- .../debugger/jdi/VirtualMachineProxyImpl.java | 3 ++- .../debugger/test/mock/SmartMockReferenceType.kt | 15 ++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java b/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java index e8a5f81a0fec..d5632007f05e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java @@ -133,7 +133,8 @@ public class VirtualMachineProxyImpl implements JdiTimer, VirtualMachineProxy { /** * Check {@link ReferenceTypeImpl#nestedTypes()} */ - private static void addNestedTypes(ReferenceType base, Collection classes, Set nested) { + @ApiStatus.Internal + public static void addNestedTypes(ReferenceType base, Collection classes, Collection nested) { String baseName = base.name(); int baseLength = baseName.length(); classes.forEach(type -> { diff --git a/plugins/kotlin/jvm-debugger/test/test/org/jetbrains/kotlin/idea/debugger/test/mock/SmartMockReferenceType.kt b/plugins/kotlin/jvm-debugger/test/test/org/jetbrains/kotlin/idea/debugger/test/mock/SmartMockReferenceType.kt index b5846ab905df..bbe9f014a202 100644 --- a/plugins/kotlin/jvm-debugger/test/test/org/jetbrains/kotlin/idea/debugger/test/mock/SmartMockReferenceType.kt +++ b/plugins/kotlin/jvm-debugger/test/test/org/jetbrains/kotlin/idea/debugger/test/mock/SmartMockReferenceType.kt @@ -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) { .filter { it.relativePath.endsWith(".class") } .map { it.readClass() } - private val referenceTypes: List by lazy { + internal val referenceTypes: List 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() + override fun toString(): String = name() + private val methodsCached by lazy { classNode.methods.map { MockMethod(it, this) } } override fun methods() = methodsCached override fun nestedTypes(): List { - 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().also { VirtualMachineProxyImpl.addNestedTypes(this, context.referenceTypes, it) } } override fun isPackagePrivate(): Boolean {