Do not wait for not generated classes in LowLevelDebuggerTestBase

This commit is contained in:
Nikolay Krasko
2018-10-25 01:37:56 +03:00
parent 651d76f4ef
commit 122fba20da
2 changed files with 27 additions and 15 deletions
@@ -1,7 +1,9 @@
package org.jetbrains.kotlin.idea.debugger package org.jetbrains.kotlin.idea.debugger
import com.sun.jdi.ThreadReference import com.sun.jdi.ThreadReference
import org.jetbrains.kotlin.codegen.ClassFileFactory
import org.jetbrains.kotlin.codegen.OriginCollectingClassBuilderFactory import org.jetbrains.kotlin.codegen.OriginCollectingClassBuilderFactory
import org.jetbrains.kotlin.codegen.getClassFiles
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -12,9 +14,10 @@ abstract class AbstractFileRankingTest : LowLevelDebuggerTestBase() {
options: Set<String>, options: Set<String>,
mainThread: ThreadReference, mainThread: ThreadReference,
factory: OriginCollectingClassBuilderFactory, factory: OriginCollectingClassBuilderFactory,
classFileFactory: ClassFileFactory,
state: GenerationState 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 } fun getKtFiles(name: String) = allKtFiles.filter { it.name == name }
val doNotCheckClassFqName = "DO_NOT_CHECK_CLASS_FQNAME" in options val doNotCheckClassFqName = "DO_NOT_CHECK_CLASS_FQNAME" in options
@@ -26,16 +29,26 @@ abstract class AbstractFileRankingTest : LowLevelDebuggerTestBase() {
val problems = mutableListOf<String>() val problems = mutableListOf<String>()
val skipClasses = skipLoadingClasses(options) val classNameToKtFile = factory.origins.asSequence()
for ((node, origin) in factory.origins) { .filter { it.key is ClassNode }
val classNode = node as? ClassNode ?: continue .map {
val expectedFile = origin.element?.containingFile as? KtFile ?: continue val ktFile = (it.value.element?.containingFile as? KtFile) ?: return@map null
val className = classNode.name.replace('/', '.') 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) { if (className in skipClasses) {
continue continue
} }
val expectedFile = classNameToKtFile[className] ?: throw IllegalStateException("Can't find source for $className")
val jdiClass = mainThread.virtualMachine().classesByName(className).singleOrNull() val jdiClass = mainThread.virtualMachine().classesByName(className).singleOrNull()
?: error("Class '$className' was not found in the debuggee process class loader") ?: error("Class '$className' was not found in the debuggee process class loader")
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.backend.common.output.OutputFile
import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.*
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.ConfigurationKind
import org.jetbrains.org.objectweb.asm.tree.ClassNode
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.net.Socket import java.net.Socket
@@ -63,8 +62,8 @@ abstract class LowLevelDebuggerTestBase : CodegenTestCase() {
try { try {
val mainThread = virtualMachine.allThreads().single { it.name() == "main" } val mainThread = virtualMachine.allThreads().single { it.name() == "main" }
waitUntil { areCompiledClassesLoaded(mainThread, classBuilderFactory, skipLoadingClasses) } waitUntil { areCompiledClassesLoaded(mainThread, classFileFactory, skipLoadingClasses) }
doTest(options, mainThread, classBuilderFactory, generationState) doTest(options, mainThread, classBuilderFactory, classFileFactory, generationState)
} finally { } finally {
virtualMachine.exit(0) virtualMachine.exit(0)
process.destroy() process.destroy()
@@ -78,6 +77,7 @@ abstract class LowLevelDebuggerTestBase : CodegenTestCase() {
options: Set<String>, options: Set<String>,
mainThread: ThreadReference, mainThread: ThreadReference,
factory: OriginCollectingClassBuilderFactory, factory: OriginCollectingClassBuilderFactory,
classFileFactory: ClassFileFactory,
state: GenerationState state: GenerationState
) )
@@ -92,13 +92,12 @@ abstract class LowLevelDebuggerTestBase : CodegenTestCase() {
private fun areCompiledClassesLoaded( private fun areCompiledClassesLoaded(
mainThread: ThreadReference, mainThread: ThreadReference,
factory: OriginCollectingClassBuilderFactory, classFileFactory: ClassFileFactory,
skipLoadingClasses: Set<String> skipLoadingClasses: Set<String>
): Boolean { ): 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) { if (fqName in skipLoadingClasses) {
continue continue
} }
@@ -155,10 +154,10 @@ abstract class LowLevelDebuggerTestBase : CodegenTestCase() {
File(classesDir, mainClassResourceName).mkdirAndWriteBytes(mainClassBytes) File(classesDir, mainClassResourceName).mkdirAndWriteBytes(mainClassBytes)
} }
private val OutputFile.internalName internal val OutputFile.internalName
get() = relativePath.substringBeforeLast(".class") get() = relativePath.substringBeforeLast(".class")
private val OutputFile.qualifiedName internal val OutputFile.qualifiedName
get() = internalName.replace('/', '.') get() = internalName.replace('/', '.')
} }