[Analysis API] add constructorSymbol to API of KtAnnotationApplicationWithArgumentsInfo

This is required for some checks on call site, and it seems that
this symbol can cover all cases.
One of the examples why this API was introduced is a request to
distinguish which vararg parameter is missed in arguments
of an annotation call from symbol light classes

^KT-62560
This commit is contained in:
Dmitrii Gridin
2023-11-01 15:59:50 +01:00
committed by Space Team
parent 3a6cdc83cf
commit 1173cc46e2
45 changed files with 192 additions and 228 deletions
@@ -471,6 +471,7 @@ internal fun ConstantValue<*>.toKtAnnotationValue(analysisContext: Fe10AnalysisC
useSiteTarget = null,
arguments = value.getKtNamedAnnotationArguments(analysisContext),
index = null,
constructorSymbolPointer = null,
)
)
}
@@ -618,13 +619,16 @@ internal fun createKtInitializerValue(
internal fun AnnotationDescriptor.toKtAnnotationApplication(
analysisContext: Fe10AnalysisContext,
index: Int,
): KtAnnotationApplicationWithArgumentsInfo = KtAnnotationApplicationWithArgumentsInfo(
classId = classIdForAnnotation,
psi = psi,
useSiteTarget = useSiteTarget,
arguments = getKtNamedAnnotationArguments(analysisContext),
index = index,
)
): KtAnnotationApplicationWithArgumentsInfo {
return KtAnnotationApplicationWithArgumentsInfo(
classId = classIdForAnnotation,
psi = psi,
useSiteTarget = useSiteTarget,
arguments = getKtNamedAnnotationArguments(analysisContext),
index = index,
constructorSymbolPointer = null,
)
}
internal fun AnnotationDescriptor.toKtAnnotationInfo(index: Int): KtAnnotationApplicationInfo = KtAnnotationApplicationInfo(
classId = classIdForAnnotation,
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.toResolvedConstructorSymbol
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnosticWithCandidates
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnosticWithSymbol
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeHiddenCandidateError
@@ -82,19 +83,26 @@ internal fun ConeDiagnostic.getCandidateSymbols(): Collection<FirBasedSymbol<*>>
}
internal fun FirAnnotation.toKtAnnotationApplication(
useSiteSession: FirSession,
builder: KtSymbolByFirBuilder,
index: Int,
arguments: List<KtNamedAnnotationValue> = FirAnnotationValueConverter.toNamedConstantValue(
mapAnnotationParameters(this),
useSiteSession,
builder,
)
): KtAnnotationApplicationWithArgumentsInfo = KtAnnotationApplicationWithArgumentsInfo(
classId = toAnnotationClassId(useSiteSession),
psi = psi as? KtCallElement,
useSiteTarget = useSiteTarget,
arguments = arguments,
index = index,
)
): KtAnnotationApplicationWithArgumentsInfo {
val constructorSymbol = (this as? FirAnnotationCall)?.calleeReference
?.toResolvedConstructorSymbol()
?.let(builder.functionLikeBuilder::buildConstructorSymbol)
return KtAnnotationApplicationWithArgumentsInfo(
classId = toAnnotationClassId(builder.rootSession),
psi = psi as? KtCallElement,
useSiteTarget = useSiteTarget,
arguments = arguments,
index = index,
constructorSymbolPointer = with(builder.analysisSession) { constructorSymbol?.createPointer() },
)
}
internal fun FirAnnotation.toKtAnnotationInfo(
useSiteSession: FirSession,
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -42,13 +42,14 @@ import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedSymbolError
import org.jetbrains.kotlin.fir.resolve.getContainingClass
import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag
import org.jetbrains.kotlin.fir.resolve.inference.ConeTypeParameterBasedTypeVariable
import org.jetbrains.kotlin.fir.scopes.impl.originalConstructorIfTypeAlias
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData
import org.jetbrains.kotlin.fir.scopes.impl.originalConstructorIfTypeAlias
import org.jetbrains.kotlin.fir.scopes.impl.toConeType
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
@@ -71,13 +72,13 @@ import kotlin.contracts.contract
/**
* Maps FirElement to KtSymbol & ConeType to KtType, thread safe
*/
internal class KtSymbolByFirBuilder constructor(
internal class KtSymbolByFirBuilder(
private val project: Project,
private val analysisSession: KtFirAnalysisSession,
val analysisSession: KtFirAnalysisSession,
val token: KtLifetimeToken,
) {
private val firResolveSession: LLFirResolveSession = analysisSession.firResolveSession
private val firProvider get() = firResolveSession.useSiteFirSession.symbolProvider
private val firResolveSession: LLFirResolveSession get() = analysisSession.firResolveSession
private val firProvider: FirSymbolProvider get() = rootSession.symbolProvider
val rootSession: FirSession = firResolveSession.useSiteFirSession
private val symbolsCache = BuilderCache<FirBasedSymbol<*>, KtSymbol>()
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.annotations.AnnotationUseSiteTargetFilt
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationInfo
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
@@ -19,12 +20,14 @@ import org.jetbrains.kotlin.name.ClassId
internal class KtFirAnnotationListForDeclaration private constructor(
val firSymbol: FirBasedSymbol<*>,
private val useSiteSession: FirSession,
override val token: KtLifetimeToken,
private val builder: KtSymbolByFirBuilder,
) : KtAnnotationsList() {
override val token: KtLifetimeToken get() = builder.token
private val useSiteSession: FirSession get() = builder.rootSession
override val annotations: List<KtAnnotationApplicationWithArgumentsInfo>
get() = withValidityAssertion {
annotations(firSymbol, useSiteSession)
annotations(firSymbol, builder)
}
override val annotationInfos: List<KtAnnotationApplicationInfo>
@@ -40,7 +43,7 @@ internal class KtFirAnnotationListForDeclaration private constructor(
classId: ClassId,
useSiteTargetFilter: AnnotationUseSiteTargetFilter,
): List<KtAnnotationApplicationWithArgumentsInfo> = withValidityAssertion {
annotationsByClassId(firSymbol, classId, useSiteTargetFilter, useSiteSession)
annotationsByClassId(firSymbol, classId, useSiteTargetFilter, builder)
}
override val annotationClassIds: Collection<ClassId>
@@ -49,18 +52,14 @@ internal class KtFirAnnotationListForDeclaration private constructor(
}
companion object {
fun create(
firSymbol: FirBasedSymbol<*>,
useSiteSession: FirSession,
token: KtLifetimeToken,
): KtAnnotationsList {
fun create(firSymbol: FirBasedSymbol<*>, builder: KtSymbolByFirBuilder): KtAnnotationsList {
return when {
firSymbol is FirBackingFieldSymbol && firSymbol.propertySymbol.annotations.any { it.useSiteTarget == null } ->
KtFirAnnotationListForDeclaration(firSymbol, useSiteSession, token)
KtFirAnnotationListForDeclaration(firSymbol, builder)
firSymbol.annotations.isEmpty() ->
KtEmptyAnnotationsList(token)
KtEmptyAnnotationsList(builder.token)
else ->
KtFirAnnotationListForDeclaration(firSymbol, useSiteSession, token)
KtFirAnnotationListForDeclaration(firSymbol, builder)
}
}
}
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.annotations.AnnotationUseSiteTargetFilt
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationInfo
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
@@ -20,12 +21,14 @@ import org.jetbrains.kotlin.name.ClassId
internal class KtFirAnnotationListForReceiverParameter private constructor(
private val firCallableSymbol: FirCallableSymbol<*>,
private val receiverParameter: FirAnnotationContainer,
private val useSiteSession: FirSession,
override val token: KtLifetimeToken,
private val builder: KtSymbolByFirBuilder,
) : KtAnnotationsList() {
private val useSiteSession: FirSession get() = builder.rootSession
override val token: KtLifetimeToken get() = builder.token
override val annotations: List<KtAnnotationApplicationWithArgumentsInfo>
get() = withValidityAssertion {
annotations(firCallableSymbol, useSiteSession, receiverParameter)
annotations(firCallableSymbol, builder, receiverParameter)
}
override val annotationInfos: List<KtAnnotationApplicationInfo>
@@ -41,7 +44,7 @@ internal class KtFirAnnotationListForReceiverParameter private constructor(
classId: ClassId,
useSiteTargetFilter: AnnotationUseSiteTargetFilter,
): List<KtAnnotationApplicationWithArgumentsInfo> = withValidityAssertion {
annotationsByClassId(firCallableSymbol, classId, useSiteTargetFilter, useSiteSession, receiverParameter)
annotationsByClassId(firCallableSymbol, classId, useSiteTargetFilter, builder, receiverParameter)
}
override val annotationClassIds: Collection<ClassId>
@@ -50,16 +53,12 @@ internal class KtFirAnnotationListForReceiverParameter private constructor(
}
companion object {
fun create(
firCallableSymbol: FirCallableSymbol<*>,
useSiteSession: FirSession,
token: KtLifetimeToken,
): KtAnnotationsList {
fun create(firCallableSymbol: FirCallableSymbol<*>, builder: KtSymbolByFirBuilder): KtAnnotationsList {
val receiverParameter = firCallableSymbol.receiverParameter
return if (receiverParameter?.annotations?.isEmpty() != false) {
KtEmptyAnnotationsList(token)
KtEmptyAnnotationsList(builder.token)
} else {
KtFirAnnotationListForReceiverParameter(firCallableSymbol, receiverParameter, useSiteSession, token)
KtFirAnnotationListForReceiverParameter(firCallableSymbol, receiverParameter, builder)
}
}
}
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.annotations.AnnotationUseSiteTargetFilt
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationInfo
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationInfo
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
@@ -27,13 +28,15 @@ import org.jetbrains.kotlin.name.ClassId
internal class KtFirAnnotationListForType private constructor(
val coneType: ConeKotlinType,
private val useSiteSession: FirSession,
override val token: KtLifetimeToken,
private val builder: KtSymbolByFirBuilder,
) : KtAnnotationsList() {
override val token: KtLifetimeToken get() = builder.token
private val useSiteSession: FirSession get() = builder.rootSession
override val annotations: List<KtAnnotationApplicationWithArgumentsInfo>
get() = withValidityAssertion {
coneType.customAnnotationsWithLazyResolve(FirResolvePhase.ANNOTATION_ARGUMENTS).mapIndexed { index, annotation ->
annotation.toKtAnnotationApplication(useSiteSession, index)
annotation.toKtAnnotationApplication(builder, index)
}
}
@@ -59,7 +62,7 @@ internal class KtFirAnnotationListForType private constructor(
return@mapIndexedNotNull null
}
annotation.toKtAnnotationApplication(useSiteSession, index)
annotation.toKtAnnotationApplication(builder, index)
}
}
@@ -69,15 +72,11 @@ internal class KtFirAnnotationListForType private constructor(
}
companion object {
fun create(
coneType: ConeKotlinType,
useSiteSession: FirSession,
token: KtLifetimeToken,
): KtAnnotationsList {
fun create(coneType: ConeKotlinType, builder: KtSymbolByFirBuilder): KtAnnotationsList {
return if (coneType.customAnnotations.isEmpty()) {
KtEmptyAnnotationsList(token)
KtEmptyAnnotationsList(builder.token)
} else {
KtFirAnnotationListForType(coneType, useSiteSession, token)
KtFirAnnotationListForType(coneType, builder)
}
}
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.analysis.api.fir.annotations
import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationInfo
import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry
@@ -44,23 +45,23 @@ internal fun annotationsByClassId(
firSymbol: FirBasedSymbol<*>,
classId: ClassId,
useSiteTargetFilter: AnnotationUseSiteTargetFilter,
useSiteSession: FirSession,
builder: KtSymbolByFirBuilder,
annotationContainer: FirAnnotationContainer = firSymbol.fir,
): List<KtAnnotationApplicationWithArgumentsInfo> =
if (classId == StandardClassIds.Annotations.Target && firSymbol.fir.resolvePhase < FirResolvePhase.ANNOTATION_ARGUMENTS) {
annotationContainer.resolvedAnnotationsWithClassIds(firSymbol)
.mapIndexedToAnnotationApplication(useSiteTargetFilter, useSiteSession, classId) { index, annotation ->
annotation.asKtAnnotationApplicationForTargetAnnotation(useSiteSession, index)
.mapIndexedToAnnotationApplication(useSiteTargetFilter, builder.rootSession, classId) { index, annotation ->
annotation.asKtAnnotationApplicationForTargetAnnotation(builder, index)
}
} else if (classId == JvmStandardClassIds.Annotations.Java.Target && firSymbol.fir.resolvePhase < FirResolvePhase.ANNOTATION_ARGUMENTS) {
annotationContainer.resolvedAnnotationsWithClassIds(firSymbol)
.mapIndexedToAnnotationApplication(useSiteTargetFilter, useSiteSession, classId) { index, annotation ->
annotation.asKtAnnotationApplicationForJavaTargetAnnotation(useSiteSession, index)
.mapIndexedToAnnotationApplication(useSiteTargetFilter, builder.rootSession, classId) { index, annotation ->
annotation.asKtAnnotationApplicationForJavaTargetAnnotation(builder, index)
}
} else {
annotationContainer.resolvedAnnotationsWithArguments(firSymbol)
.mapIndexedToAnnotationApplication(useSiteTargetFilter, useSiteSession, classId) { index, annotation ->
annotation.toKtAnnotationApplication(useSiteSession, index)
.mapIndexedToAnnotationApplication(useSiteTargetFilter, builder.rootSession, classId) { index, annotation ->
annotation.toKtAnnotationApplication(builder, index)
}
}
@@ -78,7 +79,7 @@ private inline fun List<FirAnnotation>.mapIndexedToAnnotationApplication(
}
private fun FirAnnotation.asKtAnnotationApplicationForAnnotationWithEnumArgument(
useSiteSession: FirSession,
builder: KtSymbolByFirBuilder,
index: Int,
expectedEnumClassId: ClassId,
annotationParameterName: Name,
@@ -107,14 +108,14 @@ private fun FirAnnotation.asKtAnnotationApplicationForAnnotationWithEnumArgument
)
}.orEmpty()
return toKtAnnotationApplication(useSiteSession, index, arguments)
return toKtAnnotationApplication(builder, index, arguments)
}
private fun FirAnnotation.asKtAnnotationApplicationForTargetAnnotation(
useSiteSession: FirSession,
builder: KtSymbolByFirBuilder,
index: Int,
): KtAnnotationApplicationWithArgumentsInfo = asKtAnnotationApplicationForAnnotationWithEnumArgument(
useSiteSession = useSiteSession,
builder = builder,
index = index,
expectedEnumClassId = StandardClassIds.AnnotationTarget,
annotationParameterName = StandardClassIds.Annotations.ParameterNames.targetAllowedTargets,
@@ -122,14 +123,14 @@ private fun FirAnnotation.asKtAnnotationApplicationForTargetAnnotation(
)
private fun FirAnnotation.asKtAnnotationApplicationForJavaTargetAnnotation(
useSiteSession: FirSession,
builder: KtSymbolByFirBuilder,
index: Int,
): KtAnnotationApplicationWithArgumentsInfo = asKtAnnotationApplicationForAnnotationWithEnumArgument(
useSiteSession = useSiteSession,
builder = builder,
index = index,
expectedEnumClassId = JvmStandardClassIds.Annotations.Java.ElementType,
annotationParameterName = StandardClassIds.Annotations.ParameterNames.value,
nameMapper = { ElementType.values().firstOrNull { enumValue -> enumValue.name == it }?.name },
nameMapper = { ElementType.entries.firstOrNull { enumValue -> enumValue.name == it }?.name },
)
private fun <T> FirAnnotation.findFromRawArguments(expectedEnumClass: ClassId, transformer: (String) -> T?): Set<T> = buildSet {
@@ -150,11 +151,11 @@ private fun <T> FirAnnotation.findFromRawArguments(expectedEnumClass: ClassId, t
internal fun annotations(
firSymbol: FirBasedSymbol<*>,
useSiteSession: FirSession,
builder: KtSymbolByFirBuilder,
annotationContainer: FirAnnotationContainer = firSymbol.fir,
): List<KtAnnotationApplicationWithArgumentsInfo> =
annotationContainer.resolvedAnnotationsWithArguments(firSymbol).mapIndexed { index, annotation ->
annotation.toKtAnnotationApplication(useSiteSession, index)
annotation.toKtAnnotationApplication(builder, index)
}
internal fun annotationInfos(
@@ -1,11 +1,10 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.fir.components
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationValue
import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
import org.jetbrains.kotlin.analysis.api.components.KtCompileTimeConstantProvider
@@ -13,19 +12,12 @@ import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator
import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
import org.jetbrains.kotlin.fir.expressions.FirWhenBranch
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.psi
import org.jetbrains.kotlin.psi.KtExpression
internal class KtFirCompileTimeConstantProvider(
@@ -42,7 +34,7 @@ internal class KtFirCompileTimeConstantProvider(
override fun evaluateAsAnnotationValue(expression: KtExpression): KtAnnotationValue? =
(expression.getOrBuildFir(firResolveSession) as? FirExpression)?.let {
FirAnnotationValueConverter.toConstantValue(it, firResolveSession.useSiteFirSession)
FirAnnotationValueConverter.toConstantValue(it, analysisSession.firSymbolBuilder)
}
private fun evaluateFir(
@@ -9,8 +9,8 @@ import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
import org.jetbrains.kotlin.analysis.api.base.KtConstantValueFactory
import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.fullyExpandedClass
@@ -34,14 +34,13 @@ import org.jetbrains.kotlin.resolve.ArrayFqNames
internal object FirAnnotationValueConverter {
fun toNamedConstantValue(
argumentMapping: Map<Name, FirExpression>,
session: FirSession,
): List<KtNamedAnnotationValue> =
argumentMapping.map { (name, expression) ->
KtNamedAnnotationValue(
name,
expression.convertConstantExpression(session) ?: KtUnsupportedAnnotationValue
)
}
builder: KtSymbolByFirBuilder,
): List<KtNamedAnnotationValue> = argumentMapping.map { (name, expression) ->
KtNamedAnnotationValue(
name,
expression.convertConstantExpression(builder) ?: KtUnsupportedAnnotationValue
)
}
private fun <T> FirConstExpression<T>.convertConstantExpression(): KtConstantAnnotationValue? {
val expression = psi as? KtElement
@@ -71,12 +70,12 @@ internal object FirAnnotationValueConverter {
}
private fun Collection<FirExpression>.convertVarargsExpression(
session: FirSession,
builder: KtSymbolByFirBuilder,
): Pair<Collection<KtAnnotationValue>, KtElement?> {
var representativePsi: KtElement? = null
val flattenedVarargs = buildList {
for (expr in this@convertVarargsExpression) {
val converted = expr.convertConstantExpression(session) ?: continue
val converted = expr.convertConstantExpression(builder) ?: continue
if (expr is FirSpreadArgumentExpression || expr is FirNamedArgumentExpression) {
addAll((converted as KtArrayAnnotationValue).values)
@@ -93,40 +92,38 @@ internal object FirAnnotationValueConverter {
fun toConstantValue(
firExpression: FirExpression,
session: FirSession,
): KtAnnotationValue? = firExpression.convertConstantExpression(session)
builder: KtSymbolByFirBuilder,
): KtAnnotationValue? = firExpression.convertConstantExpression(builder)
private fun FirExpression.convertConstantExpression(
session: FirSession,
): KtAnnotationValue? {
private fun FirExpression.convertConstantExpression(builder: KtSymbolByFirBuilder): KtAnnotationValue? {
val sourcePsi = psi as? KtElement
return when (this) {
is FirConstExpression<*> -> convertConstantExpression()
is FirNamedArgumentExpression -> {
expression.convertConstantExpression(session)
expression.convertConstantExpression(builder)
}
is FirSpreadArgumentExpression -> {
expression.convertConstantExpression(session)
expression.convertConstantExpression(builder)
}
is FirVarargArgumentsExpression -> {
// Vararg arguments may have multiple independent expressions associated.
// Choose one to be the representative PSI value for the entire assembled argument.
val (annotationValues, representativePsi) = arguments.convertVarargsExpression(session)
val (annotationValues, representativePsi) = arguments.convertVarargsExpression(builder)
KtArrayAnnotationValue(annotationValues, representativePsi ?: sourcePsi)
}
is FirArrayLiteral -> {
// Desugared collection literals.
KtArrayAnnotationValue(argumentList.arguments.convertVarargsExpression(session).first, sourcePsi)
KtArrayAnnotationValue(argumentList.arguments.convertVarargsExpression(builder).first, sourcePsi)
}
is FirFunctionCall -> {
val reference = calleeReference as? FirResolvedNamedReference ?: return null
when (val resolvedSymbol = reference.resolvedSymbol) {
is FirConstructorSymbol -> {
val classSymbol = resolvedSymbol.getContainingClassSymbol(session) ?: return null
val classSymbol = resolvedSymbol.getContainingClassSymbol(builder.rootSession) ?: return null
if ((classSymbol.fir as? FirClass)?.classKind == ClassKind.ANNOTATION_CLASS) {
val resultMap = mutableMapOf<Name, FirExpression>()
resolvedArgumentMapping?.entries?.forEach { (arg, param) ->
@@ -138,8 +135,11 @@ internal object FirAnnotationValueConverter {
resolvedSymbol.callableId.classId,
psi as? KtCallElement,
useSiteTarget = null,
toNamedConstantValue(resultMap, session),
toNamedConstantValue(resultMap, builder),
index = null,
constructorSymbolPointer = with(builder.analysisSession) {
builder.functionLikeBuilder.buildConstructorSymbol(resolvedSymbol).createPointer()
},
)
)
} else null
@@ -148,7 +148,7 @@ internal object FirAnnotationValueConverter {
is FirNamedFunctionSymbol -> {
// arrayOf call with a single vararg argument.
if (resolvedSymbol.callableId.asSingleFqName() in ArrayFqNames.ARRAY_CALL_FQ_NAMES)
argumentList.arguments.single().convertConstantExpression(session)
argumentList.arguments.single().convertConstantExpression(builder)
else null
}
@@ -174,7 +174,7 @@ internal object FirAnnotationValueConverter {
is FirGetClassCall -> {
var symbol = (argument as? FirResolvedQualifier)?.symbol
if (symbol is FirTypeAliasSymbol) {
symbol = symbol.fullyExpandedClass(session) ?: symbol
symbol = symbol.fullyExpandedClass(builder.rootSession) ?: symbol
}
when {
symbol == null -> {
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -34,7 +34,7 @@ internal class KtFirAnonymousFunctionSymbol(
override val annotationsList: KtAnnotationsList
get() = withValidityAssertion {
KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(analysisSession.firSymbolBuilder) }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -26,7 +26,7 @@ internal open class KtFirAnonymousObjectSymbol(
override val psi: PsiElement? = withValidityAssertion { firSymbol.fir.getAllowedPsi() }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val superTypes: List<KtType> by cached { firSymbol.superTypesList(builder) }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -26,7 +26,7 @@ internal class KtFirBackingFieldSymbol(
override val annotationsList: KtAnnotationsList
get() = withValidityAssertion {
KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -49,11 +49,7 @@ internal class KtFirConstructorSymbol(
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token,
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val containingClassIdIfNonLocal: ClassId?
@@ -47,7 +47,7 @@ internal class KtFirDestructuringDeclarationSymbol(
}
override val annotationsList: KtAnnotationsList
get() = withValidityAssertion { KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token) }
get() = withValidityAssertion { KtFirAnnotationListForDeclaration.create(firSymbol, builder) }
override val entries: List<KtLocalVariableSymbol>
get() = withValidityAssertion {
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -35,7 +35,7 @@ internal class KtFirEnumEntrySymbol(
override val annotationsList: KtAnnotationsList
get() = withValidityAssertion {
KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val name: Name get() = withValidityAssertion { firSymbol.name }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -31,11 +31,7 @@ internal class KtFirFileSymbol(
}
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token,
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override fun equals(other: Any?): Boolean = symbolEquals(other)
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -68,11 +68,7 @@ internal class KtFirFunctionSymbol(
get() = withValidityAssertion { firSymbol.fir.hasStableParameterNames }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token,
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val isSuspend: Boolean get() = withValidityAssertion { firSymbol.isSuspend }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -37,7 +37,7 @@ internal class KtFirJavaFieldSymbol(
override val annotationsList: KtAnnotationsList
get() = withValidityAssertion {
KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val isVal: Boolean get() = withValidityAssertion { firSymbol.fir.isVal }
@@ -21,10 +21,7 @@ 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.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.pointers.UnsupportedSymbolKind
import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointerOfType
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.containingClassLookupTag
@@ -38,7 +35,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.isExtension
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
internal class KtFirKotlinPropertySymbol(
override val firSymbol: FirPropertySymbol,
@@ -64,7 +60,7 @@ internal class KtFirKotlinPropertySymbol(
override val contextReceivers: List<KtContextReceiver> by cached { firSymbol.createContextReceivers(builder) }
override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension }
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer(analysisSession.firResolveSession) }
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer(builder) }
override val symbolKind: KtSymbolKind
get() = withValidityAssertion {
@@ -81,11 +77,7 @@ internal class KtFirKotlinPropertySymbol(
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() }
@@ -37,7 +37,7 @@ internal abstract class KtFirLocalOrErrorVariableSymbol<E : FirVariable, S : Fir
override val annotationsList: KtAnnotationsList
get() = withValidityAssertion {
KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val name: Name get() = withValidityAssertion { firSymbol.name }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -59,11 +59,7 @@ internal class KtFirNamedClassOrObjectSymbol(
}
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token,
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val isInner: Boolean get() = withValidityAssertion { firSymbol.isInner }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -59,11 +59,7 @@ internal class KtFirPropertyGetterSymbol(
override val receiverParameter: KtReceiverParameterSymbol? get() = withValidityAssertion { firSymbol.fir.propertySymbol.receiver(builder) }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token,
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
/**
@@ -69,11 +69,7 @@ internal class KtFirPropertySetterSymbol(
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token,
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
/**
@@ -131,7 +131,7 @@ internal class KtFirPsiJavaClassSymbol(
}
override val annotationsList: KtAnnotationsList by cached {
if (hasAnnotations) KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
if (hasAnnotations) KtFirAnnotationListForDeclaration.create(firSymbol, builder)
else KtEmptyAnnotationsList(token)
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -56,6 +56,6 @@ internal class KtFirReceiverParameterSymbol(
}
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForReceiverParameter.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForReceiverParameter.create(firSymbol, builder = analysisSession.firSymbolBuilder)
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -38,7 +38,7 @@ internal class KtFirSamConstructorSymbol(
override val annotationsList: KtAnnotationsList
get() = withValidityAssertion {
KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val name: Name get() = withValidityAssertion { firSymbol.name }
@@ -32,11 +32,7 @@ internal class KtFirScriptSymbol(
get() = withValidityAssertion { firSymbol.fir.psi }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token,
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val typeParameters: List<KtTypeParameterSymbol>
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -49,17 +49,13 @@ internal class KtFirSyntheticJavaPropertySymbol(
override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension }
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer(analysisSession.firResolveSession) }
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer(builder) }
override val modality: Modality get() = withValidityAssertion { firSymbol.modality }
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -51,7 +51,7 @@ internal class KtFirTypeAliasSymbol(
override val expandedType: KtType by cached { builder.typeBuilder.buildKtType(firSymbol.resolvedExpandedTypeRef) }
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val symbolKind: KtSymbolKind get() = withValidityAssertion { getSymbolKind() }
@@ -16,10 +16,10 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.isNullableAny
import org.jetbrains.kotlin.fir.analysis.checkers.typeParameterSymbols
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.UnexpandedTypeCheck
import org.jetbrains.kotlin.fir.types.isNullableAny
/**
* [KtFirTypeParameterSymbolBase] provides shared implementations for [KtFirTypeParameterSymbol] and [KtFirPsiJavaTypeParameterSymbol].
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.fir.types.UnexpandedTypeCheck
internal sealed class KtFirTypeParameterSymbolBase : KtTypeParameterSymbol(), KtFirSymbol<FirTypeParameterSymbol> {
override val annotationsList: KtAnnotationsList
get() = withValidityAssertion {
KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
@OptIn(UnexpandedTypeCheck::class)
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -58,11 +58,7 @@ internal class KtFirValueParameterSymbol(
override val hasDefaultValue: Boolean get() = withValidityAssertion { firSymbol.hasDefaultValue }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
analysisSession.useSiteSession,
token,
)
KtFirAnnotationListForDeclaration.create(firSymbol, builder)
}
override val generatedPrimaryConstructorProperty: KtKotlinPropertySymbol? by cached {
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -15,14 +15,13 @@ import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue
import org.jetbrains.kotlin.analysis.api.impl.base.KtContextReceiverImpl
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolvedNamedReference
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.ConeDynamicType
import org.jetbrains.kotlin.fir.types.create
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
@@ -106,7 +105,7 @@ internal fun FirCallableSymbol<*>.dispatchReceiverType(
return type?.let { builder.typeBuilder.buildKtType(it) }
}
internal fun FirVariableSymbol<*>.getKtConstantInitializer(resolveSession: LLFirResolveSession): KtInitializerValue? {
internal fun FirVariableSymbol<*>.getKtConstantInitializer(builder: KtSymbolByFirBuilder): KtInitializerValue? {
// to avoid lazy resolve
if (fir.initializer == null) return null
@@ -122,8 +121,10 @@ internal fun FirVariableSymbol<*>.getKtConstantInitializer(resolveSession: LLFir
}
}
}
val parentIsAnnotation = dispatchReceiverType
?.toRegularClassSymbol(resolveSession.useSiteFirSession)
?.toRegularClassSymbol(builder.rootSession)
?.classKind == ClassKind.ANNOTATION_CLASS
return firInitializer.asKtInitializerValue(moduleData.session, parentIsAnnotation)
return firInitializer.asKtInitializerValue(builder, parentIsAnnotation)
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -28,7 +28,7 @@ internal class KtFirCapturedType(
get() = withValidityAssertion { builder.typeBuilder.buildTypeProjection(coneType.constructor.projection) }
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override fun asStringForDebugging(): String = withValidityAssertion { coneType.renderForDebugging() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -46,7 +46,7 @@ internal class KtFirClassErrorType(
override val errorMessage: String get() = withValidityAssertion { coneDiagnostic.reason }
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -23,7 +23,7 @@ internal class KtFirDefinitelyNotNullType(
override val token: KtLifetimeToken get() = builder.token
override val original: KtType = withValidityAssertion { builder.typeBuilder.buildKtType(this.coneType.original) }
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override fun asStringForDebugging(): String = withValidityAssertion { coneType.renderForDebugging() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -22,7 +22,7 @@ internal class KtFirDynamicType(
) : KtDynamicType(), KtFirType {
override val token: KtLifetimeToken get() = builder.token
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -26,7 +26,7 @@ internal class KtFirFlexibleType(
override val lowerBound: KtType get() = withValidityAssertion { builder.typeBuilder.buildKtType(coneType.lowerBound) }
override val upperBound: KtType get() = withValidityAssertion { builder.typeBuilder.buildKtType(coneType.upperBound) }
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() }
@@ -1,12 +1,11 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.fir.types
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.KtTypeArgumentWithVariance
import org.jetbrains.kotlin.analysis.api.KtTypeProjection
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
@@ -45,7 +44,7 @@ internal class KtFirFunctionalType(
}
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -34,7 +34,7 @@ internal class KtFirIntegerLiteralType(
}
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -27,7 +27,7 @@ internal class KtFirIntersectionType(
coneType.intersectedTypes.map { conjunct -> builder.typeBuilder.buildKtType(conjunct) }
}
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -36,7 +36,7 @@ internal class KtFirTypeErrorType(
}
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override fun asStringForDebugging(): String = withValidityAssertion { coneType.renderForDebugging() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -31,7 +31,7 @@ internal class KtFirTypeParameterType(
}
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -40,7 +40,7 @@ internal class KtFirUsualClassType(
override val ownTypeArguments: List<KtTypeProjection> get() = withValidityAssertion { qualifiers.last().typeArguments }
override val annotationsList: KtAnnotationsList by cached {
KtFirAnnotationListForType.create(coneType, builder.rootSession, token)
KtFirAnnotationListForType.create(coneType, builder)
}
override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.fir.utils
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.KtConstantValueForAnnotation
import org.jetbrains.kotlin.analysis.api.KtInitializerValue
import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue
import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
@@ -72,16 +73,13 @@ internal fun FirCallableSymbol<*>.computeImportableName(useSiteSession: FirSessi
return if (canBeImported) callableId.asSingleFqName() else null
}
internal fun FirExpression.asKtInitializerValue(
session: FirSession,
forAnnotationDefaultValue: Boolean
): KtInitializerValue {
internal fun FirExpression.asKtInitializerValue(builder: KtSymbolByFirBuilder, forAnnotationDefaultValue: Boolean): KtInitializerValue {
val ktExpression = psi as? KtExpression
val evaluated =
FirCompileTimeConstantEvaluator.evaluateAsKtConstantValue(this, KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION)
val evaluated = FirCompileTimeConstantEvaluator.evaluateAsKtConstantValue(this, KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION)
return when (evaluated) {
null -> if (forAnnotationDefaultValue) {
val annotationConstantValue = FirAnnotationValueConverter.toConstantValue(this, session)
val annotationConstantValue = FirAnnotationValueConverter.toConstantValue(this, builder)
if (annotationConstantValue != null) {
KtConstantValueForAnnotation(annotationConstantValue, ktExpression)
} else {
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.analysis.api.annotations
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtCallElement
@@ -23,6 +25,11 @@ public data class KtAnnotationApplicationWithArgumentsInfo(
*/
public val arguments: List<KtNamedAnnotationValue>,
override val index: Int?,
/**
* The constructor symbol into which this annotation resolves if the annotation is correctly resolved
*/
public val constructorSymbolPointer: KtSymbolPointer<KtConstructorSymbol>?,
) : KtAnnotationApplication {
override val isCallWithArguments: Boolean get() = arguments.isNotEmpty()
}