[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:
+9
-4
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+15
@@ -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"<!>)
|
||||
|
||||
Reference in New Issue
Block a user