[IR] Outline the main logic in annotation-related helpers

Prefer smaller inline functions, because otherwise if they become
hot spots, they will complicate performance analysis, and actually
might make everything slower because of low inlining threshold in
HotSpot.
This commit is contained in:
Sergej Jaskiewicz
2023-09-05 15:46:19 +02:00
committed by teamcity
parent 157ab48fde
commit 08a9e7eae9
@@ -381,18 +381,27 @@ fun IrConstructorCall.getAnnotationStringValue(name: String): String {
return (getValueArgument(parameter.index) as IrConst<*>).value as String return (getValueArgument(parameter.index) as IrConst<*>).value as String
} }
inline fun <reified T> IrConstructorCall.getAnnotationValueOrNull(name: String): T? { inline fun <reified T> IrConstructorCall.getAnnotationValueOrNull(name: String): T? =
getAnnotationValueOrNullImpl(name) as T?
@PublishedApi
internal fun IrConstructorCall.getAnnotationValueOrNullImpl(name: String): Any? {
val parameter = symbol.owner.valueParameters.atMostOne { it.name.asString() == name } val parameter = symbol.owner.valueParameters.atMostOne { it.name.asString() == name }
return parameter?.let { getValueArgument(it.index)?.let { (it as IrConst<*>).value as T } } val argument = parameter?.let { getValueArgument(it.index) }
return (argument as IrConst<*>?)?.value
} }
inline fun <reified T> IrDeclaration.getAnnotationArgumentValue(fqName: FqName, argumentName: String): T? { inline fun <reified T> IrDeclaration.getAnnotationArgumentValue(fqName: FqName, argumentName: String): T? =
getAnnotationArgumentValueImpl(fqName, argumentName) as T?
@PublishedApi
internal fun IrDeclaration.getAnnotationArgumentValueImpl(fqName: FqName, argumentName: String): Any? {
val annotation = this.annotations.findAnnotation(fqName) ?: return null val annotation = this.annotations.findAnnotation(fqName) ?: return null
for (index in 0 until annotation.valueArgumentsCount) { for (index in 0 until annotation.valueArgumentsCount) {
val parameter = annotation.symbol.owner.valueParameters[index] val parameter = annotation.symbol.owner.valueParameters[index]
if (parameter.name == Name.identifier(argumentName)) { if (parameter.name.asString() == argumentName) {
val actual = annotation.getValueArgument(index) as? IrConst<*> ?: return null val actual = annotation.getValueArgument(index) as? IrConst<*>
return actual.value as T return actual?.value
} }
} }
return null return null