FIR: handle varargs properly during annotation serialization
This commit is contained in:
committed by
teamcityserver
parent
da671eedc9
commit
06379ec587
+18
-5
@@ -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) })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user