[Test gen] Reduce Kotlin reflection usage

This commit is contained in:
Kirill Rakhman
2024-02-26 18:06:18 +01:00
committed by Space Team
parent 6cfe81de50
commit 7ca6624af4
5 changed files with 108 additions and 133 deletions
@@ -9,17 +9,13 @@ import org.jetbrains.kotlin.generators.model.DefaultTargetBackendComputer
import org.jetbrains.kotlin.generators.model.TargetBackendComputer
import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.runners.RunnerWithTargetBackendForTestGeneratorMarker
import kotlin.reflect.KClass
import kotlin.reflect.full.createInstance
import kotlin.reflect.full.declaredMemberProperties
import kotlin.reflect.full.isSubclassOf
import java.lang.reflect.Modifier
object ReflectionBasedTargetBackendComputer : TargetBackendComputer {
private val runnerMarkerKClass = RunnerWithTargetBackendForTestGeneratorMarker::class
private const val TARGET_BACKEND_PROPERTY_NAME = "targetBackend"
private val runnerMarkerKClass = RunnerWithTargetBackendForTestGeneratorMarker::class.java
override fun compute(definedTargetBackend: TargetBackend?, testKClass: KClass<*>): TargetBackend {
if (!testKClass.isSubclassOf(runnerMarkerKClass)) return DefaultTargetBackendComputer.compute(definedTargetBackend, testKClass)
override fun compute(definedTargetBackend: TargetBackend?, testKClass: Class<*>): TargetBackend {
if (!runnerMarkerKClass.isAssignableFrom(testKClass)) return DefaultTargetBackendComputer.compute(definedTargetBackend, testKClass)
require(definedTargetBackend == null) {
"""
Test ${testKClass.simpleName} is inheritor of ${runnerMarkerKClass.simpleName} which means that
@@ -27,14 +23,13 @@ object ReflectionBasedTargetBackendComputer : TargetBackendComputer {
read from test runner class itself
""".trimIndent()
}
require(testKClass.isOpen) {
require(!Modifier.isFinal(testKClass.modifiers)) {
"""
Test runner ${testKClass.simpleName} which inherits from ${runnerMarkerKClass.simpleName} and used as base class
for real test should have `open` modality
""".trimIndent()
}
val instance = testKClass.createInstance() as RunnerWithTargetBackendForTestGeneratorMarker
val kProperty = runnerMarkerKClass.declaredMemberProperties.single { it.name == TARGET_BACKEND_PROPERTY_NAME }
return kProperty.get(instance) as TargetBackend
val instance = testKClass.newInstance() as RunnerWithTargetBackendForTestGeneratorMarker
return instance.targetBackend
}
}
@@ -10,9 +10,7 @@ import org.jetbrains.kotlin.generators.util.TestGeneratorUtil
import org.jetbrains.kotlin.generators.util.extractTagsFromDirectory
import org.jetbrains.kotlin.test.TargetBackend
import java.io.File
import java.util.concurrent.ForkJoinPool
import java.util.regex.Pattern
import kotlin.reflect.KClass
fun testGroupSuite(
init: TestGroupSuite.() -> Unit
@@ -68,13 +66,13 @@ class TestGroup(
annotations: List<AnnotationModel> = emptyList(),
noinline init: TestClass.() -> Unit
) {
val testKClass = T::class
testClass(testKClass, testKClass.java.name, suiteTestClassName, useJunit4, annotations, init)
val testKClass = T::class.java
testClass(testKClass, testKClass.name, suiteTestClassName, useJunit4, annotations, init)
}
fun testClass(
testKClass: KClass<*>,
baseTestClassName: String = testKClass.java.name,
testKClass: Class<*>,
baseTestClassName: String = testKClass.name,
suiteTestClassName: String = getDefaultSuiteTestClassName(baseTestClassName.substringAfterLast('.')),
useJunit4: Boolean,
annotations: List<AnnotationModel> = emptyList(),
@@ -84,7 +82,7 @@ class TestGroup(
}
inner class TestClass(
val testKClass: KClass<*>,
val testKClass: Class<*>,
val baseTestClassName: String,
val suiteTestClassName: String,
val useJunit4: Boolean,
@@ -6,14 +6,13 @@
package org.jetbrains.kotlin.generators.model
import org.jetbrains.kotlin.test.TargetBackend
import kotlin.reflect.KClass
fun interface TargetBackendComputer {
fun compute(definedTargetBackend: TargetBackend?, testKClass: KClass<*>): TargetBackend
fun compute(definedTargetBackend: TargetBackend?, testKClass: Class<*>): TargetBackend
}
object DefaultTargetBackendComputer : TargetBackendComputer {
override fun compute(definedTargetBackend: TargetBackend?, testKClass: KClass<*>): TargetBackend {
override fun compute(definedTargetBackend: TargetBackend?, testKClass: Class<*>): TargetBackend {
return definedTargetBackend ?: TargetBackend.ANY
}
}