AA/LC: Support annotation property->backing field move
#KT-57462 Fixed
This commit is contained in:
committed by
Space Team
parent
f6bf7560a6
commit
1f05ce2e01
+5
-1
@@ -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,
|
||||
|
||||
-1
@@ -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
|
||||
|
||||
+3
-2
@@ -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 }
|
||||
|
||||
+8
-5
@@ -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 {
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user