Migrate AbstractWriteSignatureTest.kt to CodegenTestCase stuff

This commit is contained in:
Mikhael Bogdanov
2018-08-25 08:46:03 +02:00
parent 3f79a752a5
commit efd93670f8
5 changed files with 25 additions and 62 deletions
@@ -1,3 +1,4 @@
// WITH_RUNTIME
class Out<out T> class Out<out T>
class In<in R> class In<in R>
open class Open open class Open
@@ -1,3 +1,4 @@
// WITH_RUNTIME
class OutPair<out T, out E> class OutPair<out T, out E>
class Out<out F> class Out<out F>
class In<in H> class In<in H>
@@ -1,3 +1,4 @@
// WITH_RUNTIME
class Out<out T> class Out<out T>
class In<in E> class In<in E>
@@ -1,3 +1,4 @@
// WITH_RUNTIME
class Out<out T> class Out<out T>
class Final class Final
@@ -5,62 +5,27 @@
package org.jetbrains.kotlin.jvm.compiler package org.jetbrains.kotlin.jvm.compiler
import com.google.common.io.Closeables
import com.google.common.io.Files import com.google.common.io.Files
import com.intellij.openapi.util.Disposer import org.jetbrains.kotlin.codegen.CodegenTestCase
import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.checkers.setupLanguageVersionSettingsForCompilerTests
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.codegen.GenerationUtils
import org.jetbrains.kotlin.test.ConfigurationKind
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.TestCaseWithTmpdir
import org.jetbrains.kotlin.test.TestJdkKind
import org.jetbrains.kotlin.utils.sure import org.jetbrains.kotlin.utils.sure
import org.jetbrains.org.objectweb.asm.* import org.jetbrains.org.objectweb.asm.*
import org.junit.Assert import org.junit.Assert
import java.io.File import java.io.File
import java.io.FileInputStream
import java.nio.charset.Charset import java.nio.charset.Charset
import java.util.* import java.util.*
import java.util.regex.MatchResult import java.util.regex.MatchResult
abstract class AbstractWriteSignatureTest : TestCaseWithTmpdir() { abstract class AbstractWriteSignatureTest : CodegenTestCase() {
private var environment: KotlinCoreEnvironment? = null
override fun setUp() {
super.setUp()
environment = KotlinTestUtils.createEnvironmentWithJdkAndNullabilityAnnotationsFromIdea(
myTestRootDisposable, ConfigurationKind.ALL, jdkKind
)
}
protected open val jdkKind: TestJdkKind override fun doMultiFileTest(wholeFile: File, files: MutableList<TestFile>, javaFilesDir: File?) {
get() = TestJdkKind.MOCK_JDK //setupLanguageVersionSettingsForCompilerTests(text, environment!!)
compile(files, javaFilesDir)
override fun tearDown() {
environment = null
super.tearDown()
}
protected fun doTest(ktFileName: String) {
val ktFile = File(ktFileName)
val text = FileUtil.loadFile(ktFile, true)
setupLanguageVersionSettingsForCompilerTests(text, environment!!)
val psiFile = KotlinTestUtils.createFile(ktFile.name, text, environment!!.project)
val fileFactory = GenerationUtils.compileFileTo(psiFile, environment!!, tmpdir)
Disposer.dispose(myTestRootDisposable)
val expectations = parseExpectations(ktFile)
try { try {
expectations.check() parseExpectations(wholeFile).check()
} }
catch (e: Throwable) { catch (e: Throwable) {
println(fileFactory.createText()) println(classFileFactory.createText())
throw e throw e
} }
} }
@@ -117,29 +82,27 @@ abstract class AbstractWriteSignatureTest : TestCaseWithTmpdir() {
fun check() { fun check() {
val checker = Checker() val checker = Checker()
val classFileName = "$tmpdir/${className.replace('.', '/')}.class" val relativeClassFileName = "${className.replace('.', '/')}.class"
val classFile = File(classFileName)
processClassFile(checker, classFile) val outputFile = classFileFactory.currentOutput.single { it.relativePath == relativeClassFileName }
processClassFile(checker, outputFile.asByteArray())
if (className.endsWith("Package")) { if (className.endsWith("Package")) {
// This class is a package facade. We should also check package parts. // This class is a package facade. We should also check package parts.
processPackageParts(checker, classFile) processPackageParts(checker, relativeClassFileName)
} }
checkCollectedSignatures() checkCollectedSignatures()
} }
private fun processPackageParts(checker: Checker, classFile: File) { private fun processPackageParts(checker: Checker, relativeClassFileName: String) {
// Look for package parts in the same directory. // Look for package parts in the same directory.
// Package part file names for package SomePackage look like SomePackage$<hash>.class. // Package part file names for package SomePackage look like SomePackage$<hash>.class.
val classDir = classFile.parentFile val partPrefix = relativeClassFileName.replace(".class", "\$")
val classLastName = classFile.name classFileFactory.currentOutput.filter {
val packageFacadePrefix = classLastName.replace(".class", "\$") it.relativePath.startsWith(partPrefix) && it.relativePath.endsWith(".class")
classDir.listFiles { _, lastName ->
lastName.startsWith(packageFacadePrefix) && lastName.endsWith(".class")
}.forEach { packageFacadeFile -> }.forEach { packageFacadeFile ->
processClassFile(checker, packageFacadeFile) processClassFile(checker, packageFacadeFile.asByteArray())
} }
} }
@@ -147,15 +110,11 @@ abstract class AbstractWriteSignatureTest : TestCaseWithTmpdir() {
(classExpectations + methodExpectations + fieldExpectations).forEach(SignatureExpectation::check) (classExpectations + methodExpectations + fieldExpectations).forEach(SignatureExpectation::check)
} }
private fun processClassFile(checker: Checker, classFile: File) { private fun processClassFile(checker: Checker, classData: ByteArray) {
val classInputStream = FileInputStream(classFile) ClassReader(classData).accept(
try { checker,
ClassReader(classInputStream).accept(checker, ClassReader.SKIP_CODE or ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES
ClassReader.SKIP_CODE or ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES) )
}
finally {
Closeables.closeQuietly(classInputStream)
}
} }
private inner class Checker : ClassVisitor(Opcodes.ASM5) { private inner class Checker : ClassVisitor(Opcodes.ASM5) {