[K2] Allow to evaluate constant property in FIR constant transformer

This commit is contained in:
Ivan Kylchik
2023-04-03 15:27:09 +02:00
committed by Space Team
parent 0354cf3ed7
commit 2d0acecbd2
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.serialization.constant
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.utils.isConst
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCall
@@ -16,6 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirArrayOfCallTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirArrayOfCallTransformer.Companion.isArrayOfCall
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.coneTypeSafe
@@ -108,6 +110,10 @@ private abstract class FirToConstantValueTransformer(
EnumValue(classId, (symbol.fir as FirEnumEntry).name)
}
symbol is FirPropertySymbol -> {
if (symbol.fir.isConst) symbol.fir.initializer?.accept(this, data) else null
}
symbol is FirConstructorSymbol -> {
val constructorCall = qualifiedAccessExpression as FirFunctionCall
val constructedClassSymbol = symbol.containingClassLookupTag()?.toFirRegularClassSymbol(data) ?: return null
@@ -220,6 +226,8 @@ internal object FirToConstantValueChecker : FirDefaultVisitor<Boolean, FirSessio
return when {
symbol.fir is FirEnumEntry -> symbol.fir.returnTypeRef.coneTypeSafe<ConeClassLikeType>()?.classId != null
symbol is FirPropertySymbol -> symbol.fir.isConst
symbol is FirConstructorSymbol -> {
symbol.containingClassLookupTag()?.toFirRegularClassSymbol(data)?.classKind == ClassKind.ANNOTATION_CLASS
}