Analysis API: rename KtConstantValue -> KtAnnotationValue as it is annotation specific

This commit is contained in:
Ilya Kirillov
2021-11-23 15:55:23 +01:00
parent 760e35d3b7
commit b1c8a9e886
23 changed files with 108 additions and 132 deletions
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.analysis.api.components.KtCompileTimeConstantProvide
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationValue
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
@@ -21,7 +21,7 @@ internal class KtFe10CompileTimeConstantProvider(
override val token: ValidityToken override val token: ValidityToken
get() = analysisSession.token get() = analysisSession.token
override fun evaluate(expression: KtExpression): KtConstantValue? { override fun evaluate(expression: KtExpression): KtAnnotationValue? {
val bindingContext = analysisContext.analyze(expression) val bindingContext = analysisContext.analyze(expression)
val constant = ConstantExpressionEvaluator.getPossiblyErrorConstant(expression, bindingContext) val constant = ConstantExpressionEvaluator.getPossiblyErrorConstant(expression, bindingContext)
return constant?.toConstantValue(TypeUtils.NO_EXPECTED_TYPE)?.toKtConstantValue() return constant?.toConstantValue(TypeUtils.NO_EXPECTED_TYPE)?.toKtConstantValue()
@@ -5,8 +5,6 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue
import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.KtInitializerValue
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
@@ -15,7 +13,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtType
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtType
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base
import org.jetbrains.kotlin.analysis.api.* import org.jetbrains.kotlin.analysis.api.*
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.*
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.load.kotlin.toSourceElement
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.calls.inference.CapturedType import org.jetbrains.kotlin.resolve.calls.inference.CapturedType
@@ -263,30 +262,30 @@ internal val MemberDescriptor.ktModality: Modality
return this.modality return this.modality
} }
internal fun ConstantValue<*>.toKtConstantValue(): KtConstantValue { internal fun ConstantValue<*>.toKtConstantValue(): KtAnnotationValue {
return when (this) { return when (this) {
is BooleanValue -> KtLiteralConstantValue(ConstantValueKind.Boolean, value, null) is BooleanValue -> KtLiteralAnnotationValue(ConstantValueKind.Boolean, value, null)
is CharValue -> KtLiteralConstantValue(ConstantValueKind.Char, value, null) is CharValue -> KtLiteralAnnotationValue(ConstantValueKind.Char, value, null)
is ByteValue -> KtLiteralConstantValue(ConstantValueKind.Byte, value, null) is ByteValue -> KtLiteralAnnotationValue(ConstantValueKind.Byte, value, null)
is UByteValue -> KtLiteralConstantValue(ConstantValueKind.UnsignedByte, value, null) is UByteValue -> KtLiteralAnnotationValue(ConstantValueKind.UnsignedByte, value, null)
is ShortValue -> KtLiteralConstantValue(ConstantValueKind.Short, value, null) is ShortValue -> KtLiteralAnnotationValue(ConstantValueKind.Short, value, null)
is UShortValue -> KtLiteralConstantValue(ConstantValueKind.UnsignedShort, value, null) is UShortValue -> KtLiteralAnnotationValue(ConstantValueKind.UnsignedShort, value, null)
is IntValue -> KtLiteralConstantValue(ConstantValueKind.Int, value, null) is IntValue -> KtLiteralAnnotationValue(ConstantValueKind.Int, value, null)
is UIntValue -> KtLiteralConstantValue(ConstantValueKind.UnsignedInt, value, null) is UIntValue -> KtLiteralAnnotationValue(ConstantValueKind.UnsignedInt, value, null)
is LongValue -> KtLiteralConstantValue(ConstantValueKind.Long, value, null) is LongValue -> KtLiteralAnnotationValue(ConstantValueKind.Long, value, null)
is ULongValue -> KtLiteralConstantValue(ConstantValueKind.UnsignedLong, value, null) is ULongValue -> KtLiteralAnnotationValue(ConstantValueKind.UnsignedLong, value, null)
is FloatValue -> KtLiteralConstantValue(ConstantValueKind.Float, value, null) is FloatValue -> KtLiteralAnnotationValue(ConstantValueKind.Float, value, null)
is DoubleValue -> KtLiteralConstantValue(ConstantValueKind.Double, value, null) is DoubleValue -> KtLiteralAnnotationValue(ConstantValueKind.Double, value, null)
is NullValue -> KtLiteralConstantValue(ConstantValueKind.Null, null, null) is NullValue -> KtLiteralAnnotationValue(ConstantValueKind.Null, null, null)
is StringValue -> KtLiteralConstantValue(ConstantValueKind.String, value, null) is StringValue -> KtLiteralAnnotationValue(ConstantValueKind.String, value, null)
is ArrayValue -> KtArrayConstantValue(value.map { it.toKtConstantValue() }, null) is ArrayValue -> KtArrayAnnotationValue(value.map { it.toKtConstantValue() }, null)
is EnumValue -> KtEnumEntryConstantValue(CallableId(enumClassId, enumEntryName), null) is EnumValue -> KtEnumEntryAnnotationValue(CallableId(enumClassId, enumEntryName), null)
is AnnotationValue -> { is AnnotationValue -> {
val arguments = value.allValueArguments.map { (name, v) -> KtNamedConstantValue(name.asString(), v.toKtConstantValue()) } val arguments = value.allValueArguments.map { (name, v) -> KtNamedConstantValue(name.asString(), v.toKtConstantValue()) }
KtAnnotationConstantValue(value.annotationClass?.classId, arguments, null) KtAnnotationAnnotationValue(value.annotationClass?.classId, arguments, null)
} }
is ErrorValue -> KtErrorValue(this.toString()) is ErrorValue -> KtErrorValue(this.toString())
else -> KtUnsupportedConstantValue else -> KtUnsupportedAnnotationValue
} }
} }
@@ -5,12 +5,9 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased
import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue
import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.KtInitializerValue
import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.createKtInitializerValue import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.createKtInitializerValue
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktModality import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktModality
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
@@ -25,9 +22,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtUnsupportedConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtType
@@ -42,8 +37,6 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
import org.jetbrains.kotlin.types.TypeUtils
internal class KtFe10PsiKotlinPropertySymbol( internal class KtFe10PsiKotlinPropertySymbol(
override val psi: KtProperty, override val psi: KtProperty,
@@ -5,12 +5,11 @@
package org.jetbrains.kotlin.analysis.api.descriptors.utils package org.jetbrains.kotlin.analysis.api.descriptors.utils
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.components.KtTypeRendererOptions import org.jetbrains.kotlin.analysis.api.components.KtTypeRendererOptions
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType
import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType
@@ -110,14 +109,14 @@ internal class KtFe10TypeRenderer(private val options: KtTypeRendererOptions, pr
} }
} }
private fun KtFe10RendererConsumer.renderConstantValueDebug(value: KtConstantValue) { private fun KtFe10RendererConsumer.renderConstantValueDebug(value: KtAnnotationValue) {
when (value) { when (value) {
is KtAnnotationConstantValue -> renderAnnotationDebug(value.classId, value.arguments) is KtAnnotationAnnotationValue -> renderAnnotationDebug(value.classId, value.arguments)
is KtArrayConstantValue -> is KtArrayAnnotationValue ->
renderList(value.values, separator = ", ", prefix = "[", postfix = "]") { renderConstantValueDebug(it) } renderList(value.values, separator = ", ", prefix = "[", postfix = "]") { renderConstantValueDebug(it) }
is KtEnumEntryConstantValue -> append(value.callableId) is KtEnumEntryAnnotationValue -> append(value.callableId)
is KtLiteralConstantValue<*> -> append(value.constantValueKind.asString).append("(").append(value.value).append(")") is KtLiteralAnnotationValue<*> -> append(value.constantValueKind.asString).append("(").append(value.value).append(")")
KtUnsupportedConstantValue -> append(KtUnsupportedConstantValue::class.java.simpleName) KtUnsupportedAnnotationValue -> append(KtUnsupportedAnnotationValue::class.java.simpleName)
is KtErrorValue -> append("<ERROR>") is KtErrorValue -> append("<ERROR>")
} }
} }
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.analysis.api.fir.components package org.jetbrains.kotlin.analysis.api.fir.components
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationValue
import org.jetbrains.kotlin.analysis.api.annotations.KtErrorValue
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
@@ -12,7 +14,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirEle
import org.jetbrains.kotlin.analysis.api.components.KtCompileTimeConstantProvider import org.jetbrains.kotlin.analysis.api.components.KtCompileTimeConstantProvider
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.api.withValidityAssertion
import org.jetbrains.kotlin.fir.expressions.FirWhenBranch import org.jetbrains.kotlin.fir.expressions.FirWhenBranch
@@ -23,7 +24,7 @@ internal class KtFirCompileTimeConstantProvider(
override val token: ValidityToken, override val token: ValidityToken,
) : KtCompileTimeConstantProvider(), KtFirAnalysisSessionComponent { ) : KtCompileTimeConstantProvider(), KtFirAnalysisSessionComponent {
override fun evaluate(expression: KtExpression): KtConstantValue? = withValidityAssertion { override fun evaluate(expression: KtExpression): KtAnnotationValue? = withValidityAssertion {
when (val fir = expression.getOrBuildFir(firResolveState)) { when (val fir = expression.getOrBuildFir(firResolveState)) {
is FirExpression -> { is FirExpression -> {
try { try {
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.analysis.api.fir.evaluate package org.jetbrains.kotlin.analysis.api.fir.evaluate
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationValue
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirConstExpression
@@ -37,7 +37,7 @@ internal object FirCompileTimeConstantEvaluator {
else -> null else -> null
} }
fun evaluateAsKtConstantExpression(expression: FirExpression): KtConstantValue? { fun evaluateAsKtConstantExpression(expression: FirExpression): KtAnnotationValue? {
val evaluated = evaluate(expression) ?: return null val evaluated = evaluate(expression) ?: return null
return KtFirConstantValueConverter.toConstantValue(evaluated) return KtFirConstantValueConverter.toConstantValue(evaluated)
} }
@@ -5,8 +5,7 @@
package org.jetbrains.kotlin.analysis.api.fir.evaluate package org.jetbrains.kotlin.analysis.api.fir.evaluate
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
@@ -30,21 +29,21 @@ internal object KtFirConstantValueConverter {
argumentMapping.map { (name, expression) -> argumentMapping.map { (name, expression) ->
KtNamedConstantValue( KtNamedConstantValue(
name, name,
expression.convertConstantExpression(session) ?: KtUnsupportedConstantValue expression.convertConstantExpression(session) ?: KtUnsupportedAnnotationValue
) )
} }
fun <T> toConstantValue( fun <T> toConstantValue(
firConstExpression: FirConstExpression<T>, firConstExpression: FirConstExpression<T>,
): KtLiteralConstantValue<T> = ): KtLiteralAnnotationValue<T> =
firConstExpression.convertConstantExpression() firConstExpression.convertConstantExpression()
private fun <T> FirConstExpression<T>.convertConstantExpression(): KtLiteralConstantValue<T> = private fun <T> FirConstExpression<T>.convertConstantExpression(): KtLiteralAnnotationValue<T> =
KtLiteralConstantValue(kind, value, psi as? KtElement) KtLiteralAnnotationValue(kind, value, psi as? KtElement)
private fun Collection<FirExpression>.convertConstantExpression( private fun Collection<FirExpression>.convertConstantExpression(
session: FirSession, session: FirSession,
): Collection<KtConstantValue> = ): Collection<KtAnnotationValue> =
mapNotNull { it.convertConstantExpression(session) } mapNotNull { it.convertConstantExpression(session) }
// Refer to KtLightAnnotationParameterList#checkIfToArrayConversionExpected // Refer to KtLightAnnotationParameterList#checkIfToArrayConversionExpected
@@ -62,12 +61,12 @@ internal object KtFirConstantValueConverter {
} }
} }
private fun Collection<KtConstantValue>.toArrayConstantValueIfNecessary(sourcePsi: KtElement?): KtConstantValue? { private fun Collection<KtAnnotationValue>.toArrayConstantValueIfNecessary(sourcePsi: KtElement?): KtAnnotationValue? {
val valueArgument = if (sourcePsi is ValueArgument) sourcePsi else val valueArgument = if (sourcePsi is ValueArgument) sourcePsi else
(sourcePsi?.parents?.firstOrNull { it is ValueArgument } as? ValueArgument) (sourcePsi?.parents?.firstOrNull { it is ValueArgument } as? ValueArgument)
val wrap = valueArgument?.arrayConversionExpected() ?: false val wrap = valueArgument?.arrayConversionExpected() ?: false
return if (wrap) { return if (wrap) {
KtArrayConstantValue(this, sourcePsi) KtArrayAnnotationValue(this, sourcePsi)
} else { } else {
singleOrNull() singleOrNull()
} }
@@ -76,12 +75,12 @@ internal object KtFirConstantValueConverter {
fun toConstantValue( fun toConstantValue(
firExpression: FirExpression, firExpression: FirExpression,
session: FirSession, session: FirSession,
): KtConstantValue? = ): KtAnnotationValue? =
firExpression.convertConstantExpression(session) firExpression.convertConstantExpression(session)
private fun FirExpression.convertConstantExpression( private fun FirExpression.convertConstantExpression(
session: FirSession, session: FirSession,
): KtConstantValue? { ): KtAnnotationValue? {
return when (this) { return when (this) {
is FirConstExpression<*> -> convertConstantExpression() is FirConstExpression<*> -> convertConstantExpression()
is FirNamedArgumentExpression -> { is FirNamedArgumentExpression -> {
@@ -95,7 +94,7 @@ internal object KtFirConstantValueConverter {
} }
is FirArrayOfCall -> { is FirArrayOfCall -> {
// Desugared collection literals. // Desugared collection literals.
KtArrayConstantValue(argumentList.arguments.convertConstantExpression(session), psi as? KtElement) KtArrayAnnotationValue(argumentList.arguments.convertConstantExpression(session), psi as? KtElement)
} }
is FirFunctionCall -> { is FirFunctionCall -> {
val reference = calleeReference as? FirResolvedNamedReference ?: return null val reference = calleeReference as? FirResolvedNamedReference ?: return null
@@ -107,7 +106,7 @@ internal object KtFirConstantValueConverter {
argumentMapping?.entries?.forEach { (arg, param) -> argumentMapping?.entries?.forEach { (arg, param) ->
resultMap[param.name.asString()] = arg resultMap[param.name.asString()] = arg
} }
KtAnnotationConstantValue( KtAnnotationAnnotationValue(
resolvedSymbol.callableId.classId, resolvedSymbol.callableId.classId,
toNamedConstantValue(resultMap, session), toNamedConstantValue(resultMap, session),
psi as? KtCallElement psi as? KtCallElement
@@ -127,7 +126,7 @@ internal object KtFirConstantValueConverter {
val reference = calleeReference as? FirResolvedNamedReference ?: return null val reference = calleeReference as? FirResolvedNamedReference ?: return null
when (val resolvedSymbol = reference.resolvedSymbol) { when (val resolvedSymbol = reference.resolvedSymbol) {
is FirEnumEntrySymbol -> { is FirEnumEntrySymbol -> {
KtEnumEntryConstantValue(resolvedSymbol.callableId, psi as? KtElement) KtEnumEntryAnnotationValue(resolvedSymbol.callableId, psi as? KtElement)
} }
else -> null else -> null
} }
@@ -9,12 +9,11 @@ import org.jetbrains.kotlin.analysis.api.fir.annotations.mapAnnotationParameters
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator
import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValueRenderer import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValueRenderer
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtUnsupportedConstantValue import org.jetbrains.kotlin.analysis.api.annotations.KtUnsupportedAnnotationValue
import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
@@ -59,7 +58,7 @@ private fun renderAndSortAnnotationArguments(descriptor: FirAnnotation, session:
private fun renderConstant(value: FirExpression, useSiteSession: FirSession): String { private fun renderConstant(value: FirExpression, useSiteSession: FirSession): String {
val evaluated = FirCompileTimeConstantEvaluator.evaluate(value) val evaluated = FirCompileTimeConstantEvaluator.evaluate(value)
val constantValue = KtFirConstantValueConverter.toConstantValue(evaluated ?: value, useSiteSession) val constantValue = KtFirConstantValueConverter.toConstantValue(evaluated ?: value, useSiteSession)
?: KtUnsupportedConstantValue ?: KtUnsupportedAnnotationValue
return KtConstantValueRenderer.render(constantValue) return KtConstantValueRenderer.render(constantValue)
} }
@@ -9,7 +9,6 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter
import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.findPsi
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature
@@ -20,7 +19,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
@@ -9,7 +9,6 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.KtInitializerValue
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter
import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.findPsi
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirJavaSyntheticPropertySymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirJavaSyntheticPropertySymbolPointer
@@ -17,7 +16,6 @@ import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue
import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.fir.utils.cached
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtType
@@ -5,10 +5,10 @@
package org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider package org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider
import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService
import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider
import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtValueArgument import org.jetbrains.kotlin.psi.KtValueArgument
@@ -32,19 +32,19 @@ abstract class AbstractCompileTimeConstantEvaluatorTest(
val actual = buildString { val actual = buildString {
appendLine("expression: ${expression.text}") appendLine("expression: ${expression.text}")
appendLine("constant_value: ${analyseForTest(expression) { constantValue?.stringRepresentation() }}") appendLine("constant_value: ${analyseForTest(expression) { constantValue?.stringRepresentation() }}")
appendLine("constant: ${(constantValue as? KtLiteralConstantValue<*>)?.toConst()}") appendLine("constant: ${(constantValue as? KtLiteralAnnotationValue<*>)?.toConst()}")
} }
testServices.assertions.assertEqualsToTestDataFileSibling(actual) testServices.assertions.assertEqualsToTestDataFileSibling(actual)
} }
private fun KtConstantValue.stringRepresentation(): String { private fun KtAnnotationValue.stringRepresentation(): String {
return when (this) { return when (this) {
is KtArrayConstantValue -> buildString { is KtArrayAnnotationValue -> buildString {
appendLine("KtArrayConstantValue [") appendLine("KtArrayConstantValue [")
appendLine(INDENT, values.joinToString(separator = "\n") { it.stringRepresentation() }) appendLine(INDENT, values.joinToString(separator = "\n") { it.stringRepresentation() })
append("]") append("]")
} }
is KtAnnotationConstantValue -> buildString { is KtAnnotationAnnotationValue -> buildString {
append("KtAnnotationConstantValue(") append("KtAnnotationConstantValue(")
append(classId?.relativeClassName) append(classId?.relativeClassName)
append(", ") append(", ")
@@ -53,19 +53,19 @@ abstract class AbstractCompileTimeConstantEvaluatorTest(
} }
append(")") append(")")
} }
is KtEnumEntryConstantValue -> buildString { is KtEnumEntryAnnotationValue -> buildString {
append("KtEnumEntryConstantValue(") append("KtEnumEntryConstantValue(")
append("$callableId") append("$callableId")
append(")") append(")")
} }
is KtLiteralConstantValue<*> -> buildString { is KtLiteralAnnotationValue<*> -> buildString {
append("KtLiteralConstantValue(") append("KtLiteralConstantValue(")
append("constantValueKind=${constantValueKind}") append("constantValueKind=${constantValueKind}")
append(", ") append(", ")
append("value=${value})") append("value=${value})")
} }
is KtErrorValue -> "KtErrorValue($message)" is KtErrorValue -> "KtErrorValue($message)"
is KtUnsupportedConstantValue -> "KtUnsupportedConstantValue" is KtUnsupportedAnnotationValue -> "KtUnsupportedConstantValue"
} }
} }
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.analysis.api package org.jetbrains.kotlin.analysis.api
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationValue
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
public sealed class KtInitializerValue { public sealed class KtInitializerValue {
@@ -13,7 +13,7 @@ public sealed class KtInitializerValue {
} }
public class KtConstantInitializerValue( public class KtConstantInitializerValue(
public val constant: KtConstantValue, public val constant: KtAnnotationValue,
override val initializerPsi: KtExpression? override val initializerPsi: KtExpression?
) : KtInitializerValue() ) : KtInitializerValue()
@@ -3,9 +3,8 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.analysis.api.symbols.markers package org.jetbrains.kotlin.analysis.api.annotations
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtCallElement import org.jetbrains.kotlin.psi.KtCallElement
@@ -22,12 +21,12 @@ import org.jetbrains.kotlin.types.ConstantValueKind
* * other annotation types, and * * other annotation types, and
* * array of aforementioned types * * array of aforementioned types
* *
* [KtLiteralConstantValue] covers first two kinds; * [KtLiteralAnnotationValue] covers first two kinds;
* [KtEnumEntryConstantValue] corresponds to enum types; * [KtEnumEntryAnnotationValue] corresponds to enum types;
* [KtAnnotationConstantValue] represents annotation types (with annotation fq name and arguments); and * [KtAnnotationAnnotationValue] represents annotation types (with annotation fq name and arguments); and
* [KtArrayConstantValue] abstracts an array of [KtConstantValue]s. * [KtArrayAnnotationValue] abstracts an array of [KtAnnotationValue]s.
*/ */
public sealed class KtConstantValue( public sealed class KtAnnotationValue(
public open val sourcePsi: KtElement? = null public open val sourcePsi: KtElement? = null
) )
@@ -36,34 +35,34 @@ public sealed class KtConstantValue(
*/ */
public class KtErrorValue( public class KtErrorValue(
public val message: String public val message: String
) : KtConstantValue() ) : KtAnnotationValue()
/** /**
* This represents an unsupported expression used as an annotation value. * This represents an unsupported expression used as an annotation value.
*/ */
public object KtUnsupportedConstantValue : KtConstantValue() public object KtUnsupportedAnnotationValue : KtAnnotationValue()
public class KtArrayConstantValue( public class KtArrayAnnotationValue(
public val values: Collection<KtConstantValue>, public val values: Collection<KtAnnotationValue>,
override val sourcePsi: KtElement?, override val sourcePsi: KtElement?,
) : KtConstantValue() ) : KtAnnotationValue()
public class KtAnnotationConstantValue( public class KtAnnotationAnnotationValue(
public val classId: ClassId?, public val classId: ClassId?,
public val arguments: List<KtNamedConstantValue>, public val arguments: List<KtNamedConstantValue>,
override val sourcePsi: KtCallElement?, override val sourcePsi: KtCallElement?,
) : KtConstantValue() ) : KtAnnotationValue()
public class KtEnumEntryConstantValue( public class KtEnumEntryAnnotationValue(
public val callableId: CallableId?, public val callableId: CallableId?,
override val sourcePsi: KtElement?, override val sourcePsi: KtElement?,
) : KtConstantValue() ) : KtAnnotationValue()
public class KtLiteralConstantValue<T>( public class KtLiteralAnnotationValue<T>(
public val constantValueKind: ConstantValueKind<T>, public val constantValueKind: ConstantValueKind<T>,
public val value: T, public val value: T,
override val sourcePsi: KtElement?, override val sourcePsi: KtElement?,
) : KtConstantValue() { ) : KtAnnotationValue() {
public fun toConst(): Any? { public fun toConst(): Any? {
return (value as? Long)?.let { return (value as? Long)?.let {
when (constantValueKind) { when (constantValueKind) {
@@ -5,6 +5,4 @@
package org.jetbrains.kotlin.analysis.api.annotations package org.jetbrains.kotlin.analysis.api.annotations
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue public data class KtNamedConstantValue(val name: String, val expression: KtAnnotationValue)
public data class KtNamedConstantValue(val name: String, val expression: KtConstantValue)
@@ -5,14 +5,14 @@
package org.jetbrains.kotlin.analysis.api.components package org.jetbrains.kotlin.analysis.api.components
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationValue
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
public abstract class KtCompileTimeConstantProvider : KtAnalysisSessionComponent() { public abstract class KtCompileTimeConstantProvider : KtAnalysisSessionComponent() {
public abstract fun evaluate(expression: KtExpression): KtConstantValue? public abstract fun evaluate(expression: KtExpression): KtAnnotationValue?
} }
public interface KtCompileTimeConstantProviderMixIn : KtAnalysisSessionMixIn { public interface KtCompileTimeConstantProviderMixIn : KtAnalysisSessionMixIn {
public fun KtExpression.evaluate(): KtConstantValue? = public fun KtExpression.evaluate(): KtAnnotationValue? =
analysisSession.compileTimeConstantProvider.evaluate(this) analysisSession.compileTimeConstantProvider.evaluate(this)
} }
@@ -11,10 +11,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue
import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.KtInitializerValue
import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue
import org.jetbrains.kotlin.analysis.api.annotations.annotations
import org.jetbrains.kotlin.analysis.api.components.KtSymbolInfoProviderMixIn import org.jetbrains.kotlin.analysis.api.components.KtSymbolInfoProviderMixIn
import org.jetbrains.kotlin.analysis.api.symbols.markers.* import org.jetbrains.kotlin.analysis.api.symbols.markers.*
import org.jetbrains.kotlin.analysis.api.types.KtClassErrorType import org.jetbrains.kotlin.analysis.api.types.KtClassErrorType
@@ -141,7 +138,7 @@ public object DebugSymbolRenderer {
append(")") append(")")
} }
private fun Block.renderConstantValue(value: KtConstantValue) { private fun Block.renderConstantValue(value: KtAnnotationValue) {
append(KtConstantValueRenderer.render(value)) append(KtConstantValueRenderer.render(value))
} }
@@ -191,7 +188,7 @@ public object DebugSymbolRenderer {
// Symbol-related values // Symbol-related values
is KtSymbol -> renderSymbolTag(value) is KtSymbol -> renderSymbolTag(value)
is KtType -> renderType(value) is KtType -> renderType(value)
is KtConstantValue -> renderConstantValue(value) is KtAnnotationValue -> renderConstantValue(value)
is KtNamedConstantValue -> renderNamedConstantValue(value) is KtNamedConstantValue -> renderNamedConstantValue(value)
is KtInitializerValue -> renderKtInitializerValue(value) is KtInitializerValue -> renderKtInitializerValue(value)
is KtAnnotationApplication -> renderAnnotationApplication(value) is KtAnnotationApplication -> renderAnnotationApplication(value)
@@ -5,38 +5,38 @@
package org.jetbrains.kotlin.analysis.api.symbols.markers package org.jetbrains.kotlin.analysis.api.symbols.markers
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.types.ConstantValueKind import org.jetbrains.kotlin.types.ConstantValueKind
public object KtConstantValueRenderer { public object KtConstantValueRenderer {
public fun render(value: KtConstantValue): String = buildString { public fun render(value: KtAnnotationValue): String = buildString {
renderConstantValue(value) renderConstantValue(value)
} }
private fun StringBuilder.renderConstantValue(value: KtConstantValue) { private fun StringBuilder.renderConstantValue(value: KtAnnotationValue) {
when (value) { when (value) {
is KtAnnotationConstantValue -> { is KtAnnotationAnnotationValue -> {
renderAnnotationConstantValue(value) renderAnnotationConstantValue(value)
} }
is KtArrayConstantValue -> { is KtArrayAnnotationValue -> {
renderArrayConstantValue(value) renderArrayConstantValue(value)
} }
is KtEnumEntryConstantValue -> { is KtEnumEntryAnnotationValue -> {
renderEnumEntryConstantValue(value) renderEnumEntryConstantValue(value)
} }
is KtErrorValue -> { is KtErrorValue -> {
append("ERROR") append("ERROR")
} }
is KtLiteralConstantValue<*> -> { is KtLiteralAnnotationValue<*> -> {
renderLiteralConstantValue(value) renderLiteralConstantValue(value)
} }
KtUnsupportedConstantValue -> { KtUnsupportedAnnotationValue -> {
append("KtUnsupportedConstantValue") append("KtUnsupportedConstantValue")
} }
} }
} }
private fun StringBuilder.renderLiteralConstantValue(value: KtLiteralConstantValue<*>) { private fun StringBuilder.renderLiteralConstantValue(value: KtLiteralAnnotationValue<*>) {
when (value.constantValueKind) { when (value.constantValueKind) {
ConstantValueKind.String -> { ConstantValueKind.String -> {
append('"') append('"')
@@ -54,11 +54,11 @@ public object KtConstantValueRenderer {
} }
} }
private fun StringBuilder.renderEnumEntryConstantValue(value: KtEnumEntryConstantValue) { private fun StringBuilder.renderEnumEntryConstantValue(value: KtEnumEntryAnnotationValue) {
append(value.callableId?.asSingleFqName()?.asString()) append(value.callableId?.asSingleFqName()?.asString())
} }
private fun StringBuilder.renderAnnotationConstantValue(value: KtAnnotationConstantValue) { private fun StringBuilder.renderAnnotationConstantValue(value: KtAnnotationAnnotationValue) {
append(value.classId) append(value.classId)
if (value.arguments.isNotEmpty()) { if (value.arguments.isNotEmpty()) {
append("(") append("(")
@@ -67,13 +67,13 @@ public object KtConstantValueRenderer {
} }
} }
private fun StringBuilder.renderArrayConstantValue(value: KtArrayConstantValue) { private fun StringBuilder.renderArrayConstantValue(value: KtArrayAnnotationValue) {
append("[") append("[")
renderConstantValueList(value.values) renderConstantValueList(value.values)
append("]") append("]")
} }
private fun StringBuilder.renderConstantValueList(list: Collection<KtConstantValue>) { private fun StringBuilder.renderConstantValueList(list: Collection<KtAnnotationValue>) {
renderWithSeparator(list, ", ") { constantValue -> renderWithSeparator(list, ", ") { constantValue ->
renderConstantValue(constantValue) renderConstantValue(constantValue)
} }
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtLiteralConstantValue import org.jetbrains.kotlin.analysis.api.annotations.KtLiteralAnnotationValue
internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): Boolean = internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): Boolean =
hasAnnotation("kotlin/jvm/JvmSynthetic", annotationUseSiteTarget) hasAnnotation("kotlin/jvm/JvmSynthetic", annotationUseSiteTarget)
@@ -31,7 +31,7 @@ internal fun KtAnnotatedSymbol.getJvmNameFromAnnotation(annotationUseSiteTarget:
} }
return annotation?.let { return annotation?.let {
(it.arguments.firstOrNull()?.expression as? KtLiteralConstantValue<*>)?.value as? String (it.arguments.firstOrNull()?.expression as? KtLiteralAnnotationValue<*>)?.value as? String
} }
} }
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.analysis.api.isValid import org.jetbrains.kotlin.analysis.api.isValid
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtLiteralConstantValue import org.jetbrains.kotlin.analysis.api.annotations.KtLiteralAnnotationValue
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
@@ -113,7 +113,7 @@ internal class FirLightFieldForPropertySymbol(
if (!propertySymbol.isConst) return@lazyPub null if (!propertySymbol.isConst) return@lazyPub null
if (!propertySymbol.isVal) return@lazyPub null if (!propertySymbol.isVal) return@lazyPub null
val constInitializer = propertySymbol.initializer as? KtConstantInitializerValue ?: return@lazyPub null val constInitializer = propertySymbol.initializer as? KtConstantInitializerValue ?: return@lazyPub null
(constInitializer.constant as? KtLiteralConstantValue<*>)?.createPsiLiteral(this) (constInitializer.constant as? KtLiteralAnnotationValue<*>)?.createPsiLiteral(this)
} }
override fun getInitializer(): PsiExpression? = _initializer override fun getInitializer(): PsiExpression? = _initializer
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.components.DefaultTypeClassIds import org.jetbrains.kotlin.analysis.api.components.DefaultTypeClassIds
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
@@ -170,13 +171,13 @@ private fun escapeString(str: String): String = buildString {
} }
} }
internal fun KtConstantValue.toAnnotationMemberValue(parent: PsiElement): PsiAnnotationMemberValue? { internal fun KtAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiAnnotationMemberValue? {
return when (this) { return when (this) {
is KtArrayConstantValue -> is KtArrayAnnotationValue ->
FirPsiArrayInitializerMemberValue(sourcePsi, parent) { arrayLiteralParent -> FirPsiArrayInitializerMemberValue(sourcePsi, parent) { arrayLiteralParent ->
values.mapNotNull { element -> element.toAnnotationMemberValue(arrayLiteralParent) } values.mapNotNull { element -> element.toAnnotationMemberValue(arrayLiteralParent) }
} }
is KtAnnotationConstantValue -> is KtAnnotationAnnotationValue ->
FirLightSimpleAnnotation(classId?.relativeClassName?.asString(), parent, arguments, sourcePsi) FirLightSimpleAnnotation(classId?.relativeClassName?.asString(), parent, arguments, sourcePsi)
else -> else ->
createPsiLiteral(parent)?.let { createPsiLiteral(parent)?.let {
@@ -188,11 +189,11 @@ internal fun KtConstantValue.toAnnotationMemberValue(parent: PsiElement): PsiAnn
} }
} }
private fun KtConstantValue.asStringForPsiLiteral(): String? = private fun KtAnnotationValue.asStringForPsiLiteral(): String? =
when (this) { when (this) {
is KtEnumEntryConstantValue -> is KtEnumEntryAnnotationValue ->
"${callableId?.classId?.asSingleFqName()?.asString() ?: ""}.${callableId?.callableName}" "${callableId?.classId?.asSingleFqName()?.asString() ?: ""}.${callableId?.callableName}"
is KtLiteralConstantValue<*> -> { is KtLiteralAnnotationValue<*> -> {
when (val value = this.value) { when (val value = this.value) {
is String -> "\"${escapeString(value)}\"" is String -> "\"${escapeString(value)}\""
is Long -> "${value}L" is Long -> "${value}L"
@@ -203,7 +204,7 @@ private fun KtConstantValue.asStringForPsiLiteral(): String? =
else -> null else -> null
} }
internal fun KtConstantValue.createPsiLiteral(parent: PsiElement): PsiExpression? { internal fun KtAnnotationValue.createPsiLiteral(parent: PsiElement): PsiExpression? {
val asString = asStringForPsiLiteral() ?: return null val asString = asStringForPsiLiteral() ?: return null
val instance = PsiElementFactory.getInstance(parent.project) val instance = PsiElementFactory.getInstance(parent.project)
return try { return try {