CLI: Change kotlin reflection to java reflection
The command line argument parser is using between 0.25s and 0.5s (depending on platform) on finding annotated properties. This fix replaces the slow kotlin reflection with java reflection, which is an order of magnitude faster. #KT-58183 Fixed
This commit is contained in:
committed by
Space Team
parent
b28b0e70b6
commit
111bb461a9
+2
-1
@@ -9,6 +9,7 @@ import kotlin.reflect.KClass
|
||||
import kotlin.reflect.KProperty1
|
||||
import kotlin.reflect.KType
|
||||
import kotlin.reflect.full.memberProperties
|
||||
import kotlin.reflect.jvm.javaField
|
||||
|
||||
object CompilerArgumentsContentProspector {
|
||||
private val argumentPropertiesCache: MutableMap<KClass<out CommonToolArguments>, Collection<KProperty1<out CommonToolArguments, *>>> =
|
||||
@@ -24,7 +25,7 @@ object CompilerArgumentsContentProspector {
|
||||
mutableMapOf()
|
||||
|
||||
private fun getCompilerArgumentsProperties(kClass: KClass<out CommonToolArguments>) = argumentPropertiesCache.getOrPut(kClass) {
|
||||
kClass.memberProperties.filter { prop -> prop.annotations.any { it is Argument } }
|
||||
kClass.memberProperties.filter { prop -> prop.javaField?.getAnnotation(Argument::class.java) != null }
|
||||
}
|
||||
|
||||
private inline fun <reified R : Any?> Collection<KProperty1<out CommonToolArguments, *>>.filterByReturnType(predicate: (KType?) -> Boolean) =
|
||||
|
||||
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
||||
import org.jetbrains.kotlin.utils.DescriptionAware
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
import kotlin.reflect.KProperty1
|
||||
import kotlin.reflect.full.findAnnotation
|
||||
import kotlin.reflect.jvm.javaField
|
||||
|
||||
@Deprecated("Use IdePlatformKind instead.", level = DeprecationLevel.ERROR)
|
||||
sealed class TargetPlatformKind<out Version : TargetPlatformVersion>(
|
||||
@@ -206,7 +206,7 @@ class KotlinFacetSettings {
|
||||
val isEnabledByCompilerArgument = compilerArguments?.safeAs<A>()?.let(settingReference::get)
|
||||
if (isEnabledByCompilerArgument == true) return true
|
||||
val isEnabledByAdditionalSettings = run {
|
||||
val stringArgumentName = settingReference.findAnnotation<Argument>()?.value ?: return@run null
|
||||
val stringArgumentName = settingReference.javaField?.getAnnotation(Argument::class.java)?.value ?: return@run null
|
||||
compilerSettings?.additionalArguments?.contains(stringArgumentName, ignoreCase = true)
|
||||
}
|
||||
return isEnabledByAdditionalSettings ?: false
|
||||
|
||||
Reference in New Issue
Block a user