Migrate AbstractWriteSignatureTest.kt to CodegenTestCase stuff
This commit is contained in:
Vendored
+1
@@ -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
@@ -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>
|
||||||
|
|||||||
Vendored
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
class Out<out T>
|
class Out<out T>
|
||||||
class In<in E>
|
class In<in E>
|
||||||
|
|
||||||
|
|||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
class Out<out T>
|
class Out<out T>
|
||||||
|
|
||||||
class Final
|
class Final
|
||||||
|
|||||||
+21
-62
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user