From 122fba20da785cfc4b058c9df0940b5baa831607 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 25 Oct 2018 01:37:56 +0300 Subject: [PATCH] Do not wait for not generated classes in LowLevelDebuggerTestBase --- .../idea/debugger/AbstractFileRankingTest.kt | 25 ++++++++++++++----- .../idea/debugger/LowLevelDebuggerTestBase.kt | 17 ++++++------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/AbstractFileRankingTest.kt b/idea/tests/org/jetbrains/kotlin/idea/debugger/AbstractFileRankingTest.kt index 189ed36ba4b..8bba90b85a1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/AbstractFileRankingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/AbstractFileRankingTest.kt @@ -1,7 +1,9 @@ package org.jetbrains.kotlin.idea.debugger import com.sun.jdi.ThreadReference +import org.jetbrains.kotlin.codegen.ClassFileFactory import org.jetbrains.kotlin.codegen.OriginCollectingClassBuilderFactory +import org.jetbrains.kotlin.codegen.getClassFiles import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile @@ -12,9 +14,10 @@ abstract class AbstractFileRankingTest : LowLevelDebuggerTestBase() { options: Set, mainThread: ThreadReference, factory: OriginCollectingClassBuilderFactory, + classFileFactory: ClassFileFactory, state: GenerationState ) { - val allKtFiles = factory.origins.mapNotNull { it.value.element?.containingFile as? KtFile }.distinct() + val allKtFiles = classFileFactory.inputFiles.distinct() fun getKtFiles(name: String) = allKtFiles.filter { it.name == name } val doNotCheckClassFqName = "DO_NOT_CHECK_CLASS_FQNAME" in options @@ -26,16 +29,26 @@ abstract class AbstractFileRankingTest : LowLevelDebuggerTestBase() { val problems = mutableListOf() - val skipClasses = skipLoadingClasses(options) - for ((node, origin) in factory.origins) { - val classNode = node as? ClassNode ?: continue - val expectedFile = origin.element?.containingFile as? KtFile ?: continue - val className = classNode.name.replace('/', '.') + val classNameToKtFile = factory.origins.asSequence() + .filter { it.key is ClassNode } + .map { + val ktFile = (it.value.element?.containingFile as? KtFile) ?: return@map null + val name = (it.key as ClassNode).name.replace('/', '.') + name to ktFile + } + .filterNotNull() + .toMap() + + val skipClasses = skipLoadingClasses(options) + for (outputFile in classFileFactory.getClassFiles()) { + val className = outputFile.internalName.replace('/', '.') if (className in skipClasses) { continue } + val expectedFile = classNameToKtFile[className] ?: throw IllegalStateException("Can't find source for $className") + val jdiClass = mainThread.virtualMachine().classesByName(className).singleOrNull() ?: error("Class '$className' was not found in the debuggee process class loader") diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/LowLevelDebuggerTestBase.kt b/idea/tests/org/jetbrains/kotlin/idea/debugger/LowLevelDebuggerTestBase.kt index 67ab9f6d149..0a6a88d8fe6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/LowLevelDebuggerTestBase.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/LowLevelDebuggerTestBase.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.backend.common.output.OutputFile import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.test.ConfigurationKind -import org.jetbrains.org.objectweb.asm.tree.ClassNode import java.io.File import java.io.IOException import java.net.Socket @@ -63,8 +62,8 @@ abstract class LowLevelDebuggerTestBase : CodegenTestCase() { try { val mainThread = virtualMachine.allThreads().single { it.name() == "main" } - waitUntil { areCompiledClassesLoaded(mainThread, classBuilderFactory, skipLoadingClasses) } - doTest(options, mainThread, classBuilderFactory, generationState) + waitUntil { areCompiledClassesLoaded(mainThread, classFileFactory, skipLoadingClasses) } + doTest(options, mainThread, classBuilderFactory, classFileFactory, generationState) } finally { virtualMachine.exit(0) process.destroy() @@ -78,6 +77,7 @@ abstract class LowLevelDebuggerTestBase : CodegenTestCase() { options: Set, mainThread: ThreadReference, factory: OriginCollectingClassBuilderFactory, + classFileFactory: ClassFileFactory, state: GenerationState ) @@ -92,13 +92,12 @@ abstract class LowLevelDebuggerTestBase : CodegenTestCase() { private fun areCompiledClassesLoaded( mainThread: ThreadReference, - factory: OriginCollectingClassBuilderFactory, + classFileFactory: ClassFileFactory, skipLoadingClasses: Set ): Boolean { - for ((node, _) in factory.origins) { - val classNode = node as? ClassNode ?: continue - val fqName = classNode.name.replace('/', '.') + for (outputFile in classFileFactory.getClassFiles()) { + val fqName = outputFile.internalName.replace('/', '.') if (fqName in skipLoadingClasses) { continue } @@ -155,10 +154,10 @@ abstract class LowLevelDebuggerTestBase : CodegenTestCase() { File(classesDir, mainClassResourceName).mkdirAndWriteBytes(mainClassBytes) } - private val OutputFile.internalName + internal val OutputFile.internalName get() = relativePath.substringBeforeLast(".class") - private val OutputFile.qualifiedName + internal val OutputFile.qualifiedName get() = internalName.replace('/', '.') }