From 06379ec587de9ceb2ba303ec5a8a9b19c1490785 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 1 Jun 2021 11:37:28 +0300 Subject: [PATCH] FIR: handle varargs properly during annotation serialization --- .../constant/FirToConstantValueTransformer.kt | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/constant/FirToConstantValueTransformer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/constant/FirToConstantValueTransformer.kt index 8312582822e..0eb9ea43baf 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/constant/FirToConstantValueTransformer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/constant/FirToConstantValueTransformer.kt @@ -8,9 +8,8 @@ package org.jetbrains.kotlin.fir.serialization.constant import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.expressions.* -import org.jetbrains.kotlin.fir.types.classId -import org.jetbrains.kotlin.fir.types.coneType -import org.jetbrains.kotlin.fir.types.coneTypeUnsafe +import org.jetbrains.kotlin.fir.render +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.types.ConstantValueKind @@ -21,7 +20,7 @@ internal object FirToConstantValueTransformer : FirDefaultVisitor? { - error("Illegal element as annotation argument: ${element::class.qualifiedName}") + error("Illegal element as annotation argument: ${element::class.qualifiedName} -> ${element.render()}") } @OptIn(ExperimentalUnsignedTypes::class) @@ -76,8 +75,22 @@ internal object FirToConstantValueTransformer : FirDefaultVisitor? { val symbol = qualifiedAccessExpression.toResolvedCallableSymbol() ?: return null val enumEntry = symbol.fir as? FirEnumEntry ?: return null - val classId = enumEntry.returnTypeRef.coneType.classId ?: return null + val classId = enumEntry.returnTypeRef.coneTypeSafe()?.classId ?: return null val outerClassId = classId.outerClassId ?: return null return EnumValue(outerClassId, enumEntry.name) } + + override fun visitFunctionCall( + functionCall: FirFunctionCall, + data: Nothing? + ): ConstantValue<*>? { + return visitQualifiedAccessExpression(functionCall, data) + } + + override fun visitVarargArgumentsExpression( + varargArgumentsExpression: FirVarargArgumentsExpression, + data: Nothing? + ): ConstantValue<*> { + return ArrayValue(varargArgumentsExpression.arguments.mapNotNull { it.accept(this, null) }) + } }