AA/LC: Support annotation property->backing field move

#KT-57462 Fixed
This commit is contained in:
Mikhail Glukhikh
2023-03-24 13:32:02 +01:00
committed by Space Team
parent f6bf7560a6
commit 1f05ce2e01
119 changed files with 551 additions and 292 deletions
@@ -402,6 +402,12 @@ internal class KtSymbolByFirBuilder constructor(
}
}
fun buildBackingFieldSymbol(firSymbol: FirBackingFieldSymbol): KtFirBackingFieldSymbol {
return symbolsCache.cache(firSymbol) {
KtFirBackingFieldSymbol(firSymbol, analysisSession)
}
}
fun buildExtensionReceiverSymbol(firCallableSymbol: FirCallableSymbol<*>): KtReceiverParameterSymbol? {
if (firCallableSymbol.fir.receiverParameter == null) return null
return KtFirReceiverParameterSymbol(firCallableSymbol, analysisSession)
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol
import org.jetbrains.kotlin.name.ClassId
internal class KtFirAnnotationListForDeclaration private constructor(
@@ -53,10 +54,13 @@ internal class KtFirAnnotationListForDeclaration private constructor(
useSiteSession: FirSession,
token: KtLifetimeToken,
): KtAnnotationsList {
return if (firSymbol.annotations.isEmpty()) {
KtEmptyAnnotationsList(token)
} else {
KtFirAnnotationListForDeclaration(firSymbol, useSiteSession, token)
return when {
firSymbol is FirBackingFieldSymbol && firSymbol.propertySymbol.annotations.any { it.useSiteTarget == null } ->
KtFirAnnotationListForDeclaration(firSymbol, useSiteSession, token)
firSymbol.annotations.isEmpty() ->
KtEmptyAnnotationsList(token)
else ->
KtFirAnnotationListForDeclaration(firSymbol, useSiteSession, token)
}
}
}
@@ -18,8 +18,8 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.symbols.resolvedAnnotationsWithArguments
import org.jetbrains.kotlin.fir.symbols.resolvedAnnotationsWithClassIds
import org.jetbrains.kotlin.fir.symbols.resolveAnnotationsWithArguments
import org.jetbrains.kotlin.fir.symbols.resolveAnnotationsWithClassIds
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.custom
import org.jetbrains.kotlin.fir.types.customAnnotations
@@ -89,8 +89,8 @@ private fun ConeKotlinType.customAnnotationsWithLazyResolve(phase: FirResolvePha
for (containerSymbol in custom.containerSymbols) {
when (phase) {
FirResolvePhase.TYPES -> annotations.resolvedAnnotationsWithClassIds(containerSymbol)
FirResolvePhase.ANNOTATIONS_ARGUMENTS_MAPPING -> annotations.resolvedAnnotationsWithArguments(containerSymbol)
FirResolvePhase.TYPES -> resolveAnnotationsWithClassIds(containerSymbol)
FirResolvePhase.ANNOTATIONS_ARGUMENTS_MAPPING -> annotations.resolveAnnotationsWithArguments(containerSymbol)
else -> {}
}
}
@@ -33,7 +33,7 @@ internal class KtFirSymbolInfoProvider(
private val apiVersion = analysisSession.useSiteSession.languageVersionSettings.apiVersion
override fun getDeprecation(symbol: KtSymbol): DeprecationInfo? {
if (symbol is KtFirBackingFieldSymbol || symbol is KtFirPackageSymbol || symbol is KtReceiverParameterSymbol) return null
if (symbol is KtFirPackageSymbol || symbol is KtReceiverParameterSymbol) return null
require(symbol is KtFirSymbol<*>) { "${this::class}" }
// Optimization: Avoid building `firSymbol` of `KtFirPsiJavaClassSymbol` if it definitely isn't deprecated.
@@ -44,6 +44,7 @@ internal class KtFirSymbolInfoProvider(
return when (val firSymbol = symbol.firSymbol) {
is FirPropertySymbol -> {
firSymbol.getDeprecationForCallSite(apiVersion, AnnotationUseSiteTarget.PROPERTY)
?: firSymbol.backingFieldSymbol?.getDeprecationForCallSite(apiVersion, AnnotationUseSiteTarget.FIELD)
}
else -> {
firSymbol.getDeprecationForCallSite(apiVersion)
@@ -115,7 +116,9 @@ internal class KtFirSymbolInfoProvider(
}
private fun getJvmName(property: FirProperty, isSetter: Boolean): Name {
if (property.hasAnnotation(StandardClassIds.Annotations.JvmField, analysisSession.useSiteSession)) return property.name
if (property.backingField?.symbol?.hasAnnotation(StandardClassIds.Annotations.JvmField, analysisSession.useSiteSession) == true) {
return property.name
}
return Name.identifier(getJvmNameAsString(property, isSetter))
}
@@ -11,12 +11,10 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.KtInitializerValue
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
import org.jetbrains.kotlin.analysis.api.fir.findPsi
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.*
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
@@ -24,7 +22,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointe
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.pointers.UnsupportedSymbolKind
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.containingClassLookupTag
@@ -97,6 +94,10 @@ internal class KtFirKotlinPropertySymbol(
get() = withValidityAssertion {
firSymbol.setterSymbol?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol
}
override val backingFieldSymbol: KtBackingFieldSymbol?
get() = withValidityAssertion {
firSymbol.backingFieldSymbol?.let { builder.callableBuilder.buildBackingFieldSymbol(it) }
}
// NB: `field` in accessors indicates the property should have a backing field. To see that, though, we need BODY_RESOLVE.
override val hasBackingField: Boolean
@@ -84,6 +84,9 @@ internal class KtFirSyntheticJavaPropertySymbol(
firSymbol.setterSymbol?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol
}
override val backingFieldSymbol: KtBackingFieldSymbol?
get() = null
override val isFromPrimaryConstructor: Boolean get() = withValidityAssertion { false }
override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride }
override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic }