FIR: handle varargs properly during annotation serialization

This commit is contained in:
Mikhail Glukhikh
2021-06-01 11:37:28 +03:00
committed by teamcityserver
parent da671eedc9
commit 06379ec587
@@ -8,9 +8,8 @@ package org.jetbrains.kotlin.fir.serialization.constant
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
import org.jetbrains.kotlin.types.ConstantValueKind import org.jetbrains.kotlin.types.ConstantValueKind
@@ -21,7 +20,7 @@ internal object FirToConstantValueTransformer : FirDefaultVisitor<ConstantValue<
element: FirElement, element: FirElement,
data: Nothing? data: Nothing?
): ConstantValue<*>? { ): ConstantValue<*>? {
error("Illegal element as annotation argument: ${element::class.qualifiedName}") error("Illegal element as annotation argument: ${element::class.qualifiedName} -> ${element.render()}")
} }
@OptIn(ExperimentalUnsignedTypes::class) @OptIn(ExperimentalUnsignedTypes::class)
@@ -76,8 +75,22 @@ internal object FirToConstantValueTransformer : FirDefaultVisitor<ConstantValue<
): ConstantValue<*>? { ): ConstantValue<*>? {
val symbol = qualifiedAccessExpression.toResolvedCallableSymbol() ?: return null val symbol = qualifiedAccessExpression.toResolvedCallableSymbol() ?: return null
val enumEntry = symbol.fir as? FirEnumEntry ?: return null val enumEntry = symbol.fir as? FirEnumEntry ?: return null
val classId = enumEntry.returnTypeRef.coneType.classId ?: return null val classId = enumEntry.returnTypeRef.coneTypeSafe<ConeClassLikeType>()?.classId ?: return null
val outerClassId = classId.outerClassId ?: return null val outerClassId = classId.outerClassId ?: return null
return EnumValue(outerClassId, enumEntry.name) 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) })
}
} }