[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)
}
}