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
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.annotations.KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue
import org.jetbrains.kotlin.analysis.api.components.buildClassType
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
import org.jetbrains.kotlin.analysis.api.types.KtNonErrorClassType
import org.jetbrains.kotlin.analysis.api.types.KtType
@@ -43,7 +44,10 @@ internal fun annotationUseSiteTargetFilterOf(
internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation(
useSiteTargetFilter: AnnotationUseSiteTargetFilter = AnyAnnotationUseSiteTargetFilter,
): Boolean = hasAnnotation(JVM_SYNTHETIC_ANNOTATION_CLASS_ID, useSiteTargetFilter)
): Boolean {
if (this is KtPropertySymbol) return backingFieldSymbol?.hasJvmSyntheticAnnotation(useSiteTargetFilter) == true
return hasAnnotation(JVM_SYNTHETIC_ANNOTATION_CLASS_ID, useSiteTargetFilter)
}
internal fun KtAnnotatedSymbol.getJvmNameFromAnnotation(
useSiteTargetFilter: AnnotationUseSiteTargetFilter = AnyAnnotationUseSiteTargetFilter,
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.light.classes.symbol.annotations.hasJvmFieldAnnotation
import org.jetbrains.kotlin.light.classes.symbol.cachedValue
import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightField
import org.jetbrains.kotlin.psi.KtClassOrObject
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.config.JvmDefaultMode
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.light.classes.symbol.*
import org.jetbrains.kotlin.light.classes.symbol.annotations.*
import org.jetbrains.kotlin.light.classes.symbol.copy
import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightField
@@ -284,7 +285,7 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
if (declaration.getter?.hasBody != true && declaration.setter?.hasBody != true && declaration.visibility.isPrivateOrPrivateToThis()) return
if (declaration.hasJvmFieldAnnotation()) return
if (declaration.isJvmField) return
val propertyTypeIsValueClass = declaration.hasTypeForValueClassInSignature()
/*
@@ -587,7 +588,7 @@ internal fun SymbolLightClassBase.addPropertyBackingFields(
// All fields for companion object of classes are generated to the containing class
// For interfaces, only @JvmField-annotated properties are generated to the containing class
// Probably, the same should work for const vals but it doesn't at the moment (see KT-28294)
filter { containingClass?.isInterface == true && !it.hasJvmFieldAnnotation() }
filter { containingClass?.isInterface == true && !it.isJvmField }
}
val (ctorProperties, memberProperties) = propertySymbols.partition { it.isFromPrimaryConstructor }
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue
import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.isPrivateOrPrivateToThis
@@ -38,6 +39,7 @@ internal class SymbolLightFieldForProperty private constructor(
lightMemberOrigin: LightMemberOrigin?,
private val isStatic: Boolean,
override val kotlinOrigin: KtCallableDeclaration?,
private val backingFieldSymbolPointer: KtSymbolPointer<KtBackingFieldSymbol>?,
) : SymbolLightField(containingClass, lightMemberOrigin) {
internal constructor(
ktAnalysisSession: KtAnalysisSession,
@@ -53,6 +55,7 @@ internal class SymbolLightFieldForProperty private constructor(
lightMemberOrigin = lightMemberOrigin,
isStatic = isStatic,
kotlinOrigin = propertySymbol.sourcePsiSafe<KtCallableDeclaration>(),
backingFieldSymbolPointer = with(ktAnalysisSession) { propertySymbol.backingFieldSymbol?.createPointer() },
)
private inline fun <T> withPropertySymbol(crossinline action: context (KtAnalysisSession) (KtPropertySymbol) -> T): T {
@@ -123,19 +126,19 @@ internal class SymbolLightFieldForProperty private constructor(
}
PsiModifier.VOLATILE -> withPropertySymbol { propertySymbol ->
val hasAnnotation = propertySymbol.hasAnnotation(
val hasAnnotation = propertySymbol.backingFieldSymbol?.hasAnnotation(
VOLATILE_ANNOTATION_CLASS_ID,
AnnotationUseSiteTarget.FIELD.toOptionalFilter(),
)
) == true
mapOf(modifier to hasAnnotation)
}
PsiModifier.TRANSIENT -> withPropertySymbol { propertySymbol ->
val hasAnnotation = propertySymbol.hasAnnotation(
val hasAnnotation = propertySymbol.backingFieldSymbol?.hasAnnotation(
TRANSIENT_ANNOTATION_CLASS_ID,
AnnotationUseSiteTarget.FIELD.toOptionalFilter(),
)
) == true
mapOf(modifier to hasAnnotation)
}
@@ -153,7 +156,7 @@ internal class SymbolLightFieldForProperty private constructor(
annotationsBox = GranularAnnotationsBox(
annotationsProvider = SymbolAnnotationsProvider(
ktModule = ktModule,
annotatedSymbolPointer = propertySymbolPointer,
annotatedSymbolPointer = backingFieldSymbolPointer ?: propertySymbolPointer,
annotationUseSiteTargetFilter = AnnotationUseSiteTarget.FIELD.toOptionalFilter(),
),
additionalAnnotationsProvider = NullabilityAnnotationsProvider {
@@ -287,7 +287,8 @@ internal inline fun <T : KtSymbol, R> KtSymbolPointer<T>.withSymbol(
crossinline action: KtAnalysisSession.(T) -> R,
): R = analyzeForLightClasses(ktModule) { action(this, restoreSymbolOrThrowIfDisposed()) }
internal val KtPropertySymbol.isConstOrJvmField: Boolean get() = isConst || hasJvmFieldAnnotation()
internal val KtPropertySymbol.isConstOrJvmField: Boolean get() = isConst || isJvmField
internal val KtPropertySymbol.isJvmField: Boolean get() = backingFieldSymbol?.hasJvmFieldAnnotation() == true
internal val KtPropertySymbol.isConst: Boolean get() = (this as? KtKotlinPropertySymbol)?.isConst == true
internal val KtPropertySymbol.isLateInit: Boolean get() = (this as? KtKotlinPropertySymbol)?.isLateInit == true
internal val KtPropertySymbol.canHaveNonPrivateField: Boolean get() = isConstOrJvmField || isLateInit