[K2] Force interpretation of default argument for annotation's property

We miss these expression because they might be represented as
`IrGetFiled` values, but they still must be turned into `IrConst`.

#KT-58007 Fixed
This commit is contained in:
Ivan Kylchik
2023-04-26 14:00:10 +02:00
committed by Space Team
parent 37402336d5
commit 535806d0ab
3 changed files with 36 additions and 4 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
@@ -34,10 +35,14 @@ internal abstract class IrConstAnnotationTransformer(
private fun transformAnnotation(annotation: IrConstructorCall) {
for (i in 0 until annotation.valueArgumentsCount) {
val arg = annotation.getValueArgument(i) ?: continue
when (arg) {
is IrVararg -> annotation.putValueArgument(i, arg.transformVarArg())
else -> annotation.putValueArgument(i, arg.transformSingleArg(annotation.symbol.owner.valueParameters[i].type))
}
annotation.putValueArgument(i, transformAnnotationArgument(arg, annotation.symbol.owner.valueParameters[i]))
}
}
protected fun transformAnnotationArgument(argument: IrExpression, valueParameter: IrValueParameter): IrExpression {
return when (argument) {
is IrVararg -> argument.transformVarArg()
else -> argument.transformSingleArg(valueParameter.type)
}
}
@@ -6,12 +6,16 @@
package org.jetbrains.kotlin.ir.interpreter.checker
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.IrErrorExpression
import org.jetbrains.kotlin.ir.expressions.IrVararg
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
import org.jetbrains.kotlin.ir.util.primaryConstructor
internal class IrConstDeclarationAnnotationTransformer(
interpreter: IrInterpreter,
@@ -29,6 +33,14 @@ internal class IrConstDeclarationAnnotationTransformer(
override fun visitDeclaration(declaration: IrDeclarationBase, data: Nothing?): IrStatement {
transformAnnotations(declaration)
if (declaration is IrClass && declaration.kind == ClassKind.ANNOTATION_CLASS) {
declaration.primaryConstructor?.valueParameters?.forEach {
val defaultExpression = it.defaultValue?.expression ?: return@forEach
if (defaultExpression.canBeInterpreted()) {
it.defaultValue?.expression = transformAnnotationArgument(defaultExpression, it)
}
}
}
return super.visitDeclaration(declaration, data)
}
}
@@ -5,6 +5,21 @@
// MODULE: lib
// FILE: lib.kt
import kotlin.reflect.KClass
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class IntegerNumberValid(
val message: String = <!EVALUATED("Has illegal integer number value")!>"Has illegal integer number value"<!>,
val groups: Array<KClass<*>> = [],
val minimum: Long = Long.<!EVALUATED("-9223372036854775808")!>MIN_VALUE<!>,
val maximum: Long = Long.<!EVALUATED("9223372036854775807")!>MAX_VALUE<!>,
val minMaxArray: LongArray = longArrayOf(Long.<!EVALUATED("-9223372036854775808")!>MIN_VALUE<!>, Long.<!EVALUATED("9223372036854775807")!>MAX_VALUE<!>),
val minMaxArrayCollection: LongArray = [Long.<!EVALUATED("-9223372036854775808")!>MIN_VALUE<!>, Long.<!EVALUATED("9223372036854775807")!>MAX_VALUE<!>],
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
annotation class AnnotationWithDefault(val str: String = "Str" <!EVALUATED("String")!>+ "ing"<!>)