[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.IrElement
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
|
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
|
||||||
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
|
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
|
||||||
@@ -34,10 +35,14 @@ internal abstract class IrConstAnnotationTransformer(
|
|||||||
private fun transformAnnotation(annotation: IrConstructorCall) {
|
private fun transformAnnotation(annotation: IrConstructorCall) {
|
||||||
for (i in 0 until annotation.valueArgumentsCount) {
|
for (i in 0 until annotation.valueArgumentsCount) {
|
||||||
val arg = annotation.getValueArgument(i) ?: continue
|
val arg = annotation.getValueArgument(i) ?: continue
|
||||||
when (arg) {
|
annotation.putValueArgument(i, transformAnnotationArgument(arg, annotation.symbol.owner.valueParameters[i]))
|
||||||
is IrVararg -> annotation.putValueArgument(i, arg.transformVarArg())
|
}
|
||||||
else -> annotation.putValueArgument(i, arg.transformSingleArg(annotation.symbol.owner.valueParameters[i].type))
|
}
|
||||||
}
|
|
||||||
|
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
|
package org.jetbrains.kotlin.ir.interpreter.checker
|
||||||
|
|
||||||
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
|
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
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.IrDeclarationBase
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrErrorExpression
|
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.interpreter.IrInterpreter
|
||||||
|
import org.jetbrains.kotlin.ir.util.primaryConstructor
|
||||||
|
|
||||||
internal class IrConstDeclarationAnnotationTransformer(
|
internal class IrConstDeclarationAnnotationTransformer(
|
||||||
interpreter: IrInterpreter,
|
interpreter: IrInterpreter,
|
||||||
@@ -29,6 +33,14 @@ internal class IrConstDeclarationAnnotationTransformer(
|
|||||||
|
|
||||||
override fun visitDeclaration(declaration: IrDeclarationBase, data: Nothing?): IrStatement {
|
override fun visitDeclaration(declaration: IrDeclarationBase, data: Nothing?): IrStatement {
|
||||||
transformAnnotations(declaration)
|
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)
|
return super.visitDeclaration(declaration, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+15
@@ -5,6 +5,21 @@
|
|||||||
// MODULE: lib
|
// MODULE: lib
|
||||||
// FILE: lib.kt
|
// 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)
|
@Target(AnnotationTarget.CLASS)
|
||||||
@Retention(AnnotationRetention.BINARY)
|
@Retention(AnnotationRetention.BINARY)
|
||||||
annotation class AnnotationWithDefault(val str: String = "Str" <!EVALUATED("String")!>+ "ing"<!>)
|
annotation class AnnotationWithDefault(val str: String = "Str" <!EVALUATED("String")!>+ "ing"<!>)
|
||||||
|
|||||||
Reference in New Issue
Block a user