KT-57135, KT-54804 Take into account annotations' allowed targets. Generate property$annotations methods
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt index e774866..adabb47 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.fir.annotations.mapAnnotationParameters import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic @@ -74,7 +75,7 @@ ): KtAnnotationApplicationWithArgumentsInfo = KtAnnotationApplicationWithArgumentsInfo( classId = toAnnotationClassId(useSiteSession), psi = psi as? KtCallElement, - useSiteTarget = useSiteTarget, + useSiteTarget = effectiveUseSiteTarget, arguments = FirAnnotationValueConverter.toNamedConstantValue( mapAnnotationParameters(this), useSiteSession, @@ -88,7 +89,11 @@ ): KtAnnotationApplicationInfo = KtAnnotationApplicationInfo( classId = toAnnotationClassId(useSiteSession), psi = psi as? KtCallElement, - useSiteTarget = useSiteTarget, + useSiteTarget = effectiveUseSiteTarget, isCallWithArguments = this is FirAnnotationCall && arguments.isNotEmpty(), index = index, ) + + +val FirAnnotation.effectiveUseSiteTarget: AnnotationUseSiteTarget? + get() = calculatedUseSiteTarget ?: useSiteTarget \ No newline at end of file
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForType.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForType.kt index 1f1e13f..4592076 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForType.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForType.kt
@@ -9,6 +9,7 @@ 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.effectiveUseSiteTarget 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 @@ -46,7 +47,7 @@ override fun hasAnnotation(classId: ClassId, useSiteTargetFilter: AnnotationUseSiteTargetFilter): Boolean = withValidityAssertion { coneType.customAnnotationsWithLazyResolve(FirResolvePhase.TYPES).any { - useSiteTargetFilter.isAllowed(it.useSiteTarget) && it.toAnnotationClassId(useSiteSession) == classId + useSiteTargetFilter.isAllowed(it.effectiveUseSiteTarget) && it.toAnnotationClassId(useSiteSession) == classId } } @@ -55,7 +56,7 @@ useSiteTargetFilter: AnnotationUseSiteTargetFilter, ): List<KtAnnotationApplicationWithArgumentsInfo> = withValidityAssertion { coneType.customAnnotationsWithLazyResolve(FirResolvePhase.ANNOTATIONS_ARGUMENTS_MAPPING).mapIndexedNotNull { index, annotation -> - if (!useSiteTargetFilter.isAllowed(annotation.useSiteTarget) || annotation.toAnnotationClassId(useSiteSession) != classId) { + if (!useSiteTargetFilter.isAllowed(annotation.effectiveUseSiteTarget) || annotation.toAnnotationClassId(useSiteSession) != classId) { return@mapIndexedNotNull null }
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt index 04d656c..4b0b98e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt
@@ -8,6 +8,7 @@ import org.jetbrains.kotlin.analysis.api.annotations.AnnotationUseSiteTargetFilter import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationInfo import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo +import org.jetbrains.kotlin.analysis.api.fir.effectiveUseSiteTarget import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationApplication import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationInfo import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry @@ -56,14 +57,14 @@ val annotations = annotationContainer.resolvedCompilerRequiredAnnotations(firSymbol) for (index in annotations.indices) { val annotation = annotations[index] - if (useSiteTargetFilter.isAllowed(annotation.useSiteTarget) && annotation.toAnnotationClassIdSafe(useSiteSession) == classId) { + if (useSiteTargetFilter.isAllowed(annotation.effectiveUseSiteTarget) && annotation.toAnnotationClassIdSafe(useSiteSession) == classId) { add(annotation.toKtAnnotationApplication(useSiteSession, index)) } } } } else { annotationContainer.resolvedAnnotationsWithArguments(firSymbol).mapIndexedNotNull { index, annotation -> - if (!useSiteTargetFilter.isAllowed(annotation.useSiteTarget) || annotation.toAnnotationClassId(useSiteSession) != classId) { + if (!useSiteTargetFilter.isAllowed(annotation.effectiveUseSiteTarget) || annotation.toAnnotationClassId(useSiteSession) != classId) { return@mapIndexedNotNull null } @@ -108,7 +109,7 @@ val annotations = annotationContainer.resolvedCompilerRequiredAnnotations(firSymbol) for (index in annotations.indices) { val annotation = annotations[index] - if (useSiteTargetFilter.isAllowed(annotation.useSiteTarget) && annotation.toAnnotationClassIdSafe(useSiteSession) == classId) { + if (useSiteTargetFilter.isAllowed(annotation.effectiveUseSiteTarget) && annotation.toAnnotationClassIdSafe(useSiteSession) == classId) { return true } } @@ -116,7 +117,7 @@ false } else { annotationContainer.resolvedAnnotationsWithClassIds(firSymbol).any { - useSiteTargetFilter.isAllowed(it.useSiteTarget) && it.toAnnotationClassId(useSiteSession) == classId + useSiteTargetFilter.isAllowed(it.effectiveUseSiteTarget) && it.toAnnotationClassId(useSiteSession) == classId } } }
diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt index 8c7027e..7537d05 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightMethod +import org.jetbrains.kotlin.asJava.elements.isGetter import org.jetbrains.kotlin.asJava.elements.isSetter import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.psi.* @@ -183,7 +184,10 @@ specialGetter: PsiMethod?, specialSetter: PsiMethod? ): PropertyAccessorsPsiMethods { - val (setters, getters) = getPsiMethodWrappers(ktDeclaration).partition { it.isSetter } + val accessors = getPsiMethodWrappers(ktDeclaration).toList() + val getters = accessors.filter { it.isGetter } + val setters = accessors.filter { it.isSetter } + val annotationsHolder = accessors.singleOrNull { it.name.endsWith("\$annotations") } val allGetters = listOfNotNull(specialGetter) + getters.filterNot { it == specialGetter } val allSetters = listOfNotNull(specialSetter) + setters.filterNot { it == specialSetter } @@ -192,6 +196,7 @@ return PropertyAccessorsPsiMethods( allGetters.firstOrNull(), allSetters.firstOrNull(), + annotationsHolder, backingField, additionalAccessors ) @@ -200,15 +205,16 @@ class PropertyAccessorsPsiMethods( val getter: PsiMethod?, val setter: PsiMethod?, + val annotationsHolder: PsiMethod?, val backingField: PsiField?, - additionalAccessors: List<PsiMethod> + additionalAccessors: List<PsiMethod>, ) : Iterable<PsiMethod> { private val allMethods: List<PsiMethod> val allDeclarations: List<PsiNamedElement> init { allMethods = arrayListOf() - arrayOf(getter, setter).filterNotNullTo(allMethods) + arrayOf(getter, setter, annotationsHolder).filterNotNullTo(allMethods) additionalAccessors.filterIsInstanceTo<PsiMethod, MutableList<PsiMethod>>(allMethods) allDeclarations = arrayListOf()
diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/methodIndices.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/methodIndices.kt index 43a7036..e6c51b8 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/methodIndices.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/methodIndices.kt
@@ -7,8 +7,9 @@ const val METHOD_INDEX_FOR_GETTER = 1 const val METHOD_INDEX_FOR_SETTER = 2 -const val METHOD_INDEX_FOR_DEFAULT_CTOR = 3 -const val METHOD_INDEX_FOR_NO_ARG_OVERLOAD_CTOR = 4 -const val METHOD_INDEX_FOR_NON_ORIGIN_METHOD = 5 -const val METHOD_INDEX_FOR_SCRIPT_MAIN = 6 -const val METHOD_INDEX_BASE = 7 \ No newline at end of file +const val METHOD_INDEX_FOR_ANNOTATIONS = 3 +const val METHOD_INDEX_FOR_DEFAULT_CTOR = 4 +const val METHOD_INDEX_FOR_NO_ARG_OVERLOAD_CTOR = 5 +const val METHOD_INDEX_FOR_NON_ORIGIN_METHOD = 6 +const val METHOD_INDEX_FOR_SCRIPT_MAIN = 7 +const val METHOD_INDEX_BASE = 8 \ No newline at end of file
diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt index d8de764..a88060d 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt
@@ -182,6 +182,7 @@ } fun KtLightMethod.isAccessor(getter: Boolean): Boolean { + if (name.endsWith("\$annotations")) return false val origin = kotlinOrigin as? KtCallableDeclaration ?: return false if (origin !is KtProperty && origin !is KtParameter) return false val expectedParametersCount = (if (getter) 0 else 1) + (if (origin.receiverTypeReference != null) 1 else 0)
diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt index a3befb9..319e12e 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt
@@ -108,6 +108,10 @@ fun KtParameter.toLightSetter(): PsiMethod? = LightClassUtil.getLightClassPropertyMethods(this).setter +fun KtParameter.toLightAnnotationsHolder(): PsiMethod? = LightClassUtil.getLightClassPropertyMethods(this).annotationsHolder + +fun KtProperty.toLightAnnotationsHolder(): PsiMethod? = LightClassUtil.getLightClassPropertyMethods(this).annotationsHolder + fun KtTypeParameter.toPsiTypeParameters(): List<PsiTypeParameter> { val paramList = getNonStrictParentOfType<KtTypeParameterList>() ?: return listOf()
diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DeprecatedAdditionalAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DeprecatedAdditionalAnnotationsProvider.kt new file mode 100644 index 0000000..71b1650 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DeprecatedAdditionalAnnotationsProvider.kt
@@ -0,0 +1,38 @@ +/* + * 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.light.classes.symbol.annotations + +import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiDocCommentOwner +import com.intellij.psi.PsiModifierList +import org.jetbrains.kotlin.load.java.JvmAnnotationNames + +internal object DeprecatedAdditionalAnnotationsProvider : AdditionalAnnotationsProvider { + override fun addAllAnnotations( + currentRawAnnotations: MutableList<in PsiAnnotation>, + foundQualifiers: MutableSet<String>, + owner: PsiModifierList + ) { + if ((owner.parent as? PsiDocCommentOwner)?.isDeprecated == true) { + addSimpleAnnotationIfMissing(JvmAnnotationNames.DEPRECATED_ANNOTATION.asString(), currentRawAnnotations, foundQualifiers, owner) + } + } + + override fun isSpecialQualifier(qualifiedName: String): Boolean = false + + override fun findSpecialAnnotation( + annotationsBox: GranularAnnotationsBox, + qualifiedName: String, + owner: PsiModifierList + ): PsiAnnotation? = if ((owner.parent as? PsiDocCommentOwner)?.isDeprecated == true) + createSimpleAnnotationIfMatches( + qualifier = qualifiedName, + expectedQualifier = JvmAnnotationNames.DEPRECATED_ANNOTATION.asString(), + owner = owner, + ) + else + null +} \ No newline at end of file
diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt index ac8eea2..fecf9f7 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt
@@ -5,10 +5,7 @@ package org.jetbrains.kotlin.light.classes.symbol.classes -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiManager -import com.intellij.psi.PsiModifier -import com.intellij.psi.PsiReferenceList +import com.intellij.psi.* import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.annotations.hasAnnotation import org.jetbrains.kotlin.analysis.api.symbols.* @@ -23,6 +20,7 @@ import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.project.structure.getKtModuleOfTypeSafe import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance +import org.jetbrains.kotlin.analysis.utils.printer.parentOfType import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration import org.jetbrains.kotlin.asJava.classes.* import org.jetbrains.kotlin.asJava.elements.KtLightField @@ -42,6 +40,7 @@ import org.jetbrains.kotlin.light.classes.symbol.isConst import org.jetbrains.kotlin.light.classes.symbol.isLateInit import org.jetbrains.kotlin.light.classes.symbol.mapType +import org.jetbrains.kotlin.light.classes.symbol.methods.* import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightAccessorMethod import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightConstructor import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightNoArgConstructor @@ -286,6 +285,26 @@ if (declaration.getter?.hasBody != true && declaration.setter?.hasBody != true && declaration.visibility.isPrivateOrPrivateToThis()) return + val originalElement = declaration.sourcePsiSafe<KtDeclaration>() + + if (!this@createPropertyAccessors.isAnnotationType && declaration.psi?.parentOfType<KtClassOrObject>() == this.kotlinOrigin) { + val lightMemberOrigin = originalElement?.let { + LightMemberOriginForDeclaration( + originalElement = it, + originKind = JvmDeclarationOriginKind.OTHER, + ) + } + val method = SymbolLightAnnotationsMethod( + ktAnalysisSession = this@KtAnalysisSession, + containingPropertySymbol = declaration, + lightMemberOrigin = lightMemberOrigin, + containingClass = this@createPropertyAccessors + ) + if (method.annotations.size > 1) { // There's always a @java.lang.Deprecated + result.add(method) + } + } + if (declaration.hasJvmFieldAnnotation()) return val propertyTypeIsValueClass = declaration.hasTypeForValueClassInSignature() @@ -321,8 +340,6 @@ return !isHiddenOrSynthetic(siteTarget, useSiteTargetFilterForPropertyAccessor) } - val originalElement = declaration.sourcePsiSafe<KtDeclaration>() - val getter = declaration.getter?.takeIf { it.needToCreateAccessor(AnnotationUseSiteTarget.PROPERTY_GETTER) }
diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAnnotationsMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAnnotationsMethod.kt new file mode 100644 index 0000000..763bd90 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAnnotationsMethod.kt
@@ -0,0 +1,160 @@ +/* + * 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.light.classes.symbol.methods + +import com.intellij.openapi.util.TextRange +import com.intellij.psi.* +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe +import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin +import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_ANNOTATIONS +import org.jetbrains.kotlin.asJava.classes.lazyPub +import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget +import org.jetbrains.kotlin.light.classes.symbol.* +import org.jetbrains.kotlin.light.classes.symbol.annotations.* +import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase +import org.jetbrains.kotlin.light.classes.symbol.modifierLists.InitializedModifiersBox +import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList +import org.jetbrains.kotlin.light.classes.symbol.parameters.SymbolLightParameterList +import org.jetbrains.kotlin.light.classes.symbol.parameters.SymbolLightTypeParameterList +import org.jetbrains.kotlin.load.java.JvmAbi +import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.utils.addToStdlib.ifTrue + +internal class SymbolLightAnnotationsMethod private constructor( + lightMemberOrigin: LightMemberOrigin?, + containingClass: SymbolLightClassBase, + private val containingPropertyDeclaration: KtCallableDeclaration?, + private val containingPropertySymbolPointer: KtSymbolPointer<KtPropertySymbol>, +) : SymbolLightMethodBase( + lightMemberOrigin, + containingClass, + METHOD_INDEX_FOR_ANNOTATIONS, +) { + internal constructor( + ktAnalysisSession: KtAnalysisSession, + containingPropertySymbol: KtPropertySymbol, + lightMemberOrigin: LightMemberOrigin?, + containingClass: SymbolLightClassBase, + ) : this( + lightMemberOrigin, + containingClass, + containingPropertyDeclaration = containingPropertySymbol.sourcePsiSafe(), + containingPropertySymbolPointer = with(ktAnalysisSession) { containingPropertySymbol.createPointer() }, + ) + + context(KtAnalysisSession) + private fun propertySymbol(): KtPropertySymbol { + return containingPropertySymbolPointer.restoreSymbolOrThrowIfDisposed() + } + + private fun String.abiName(): String { + return JvmAbi.getSyntheticMethodNameForAnnotatedProperty(JvmAbi.getterName(this)) + } + + private val _name: String by lazyPub { + analyzeForLightClasses(ktModule) { + val symbol = propertySymbol() + symbol.getJvmNameFromAnnotation(AnnotationUseSiteTarget.PROPERTY.toOptionalFilter()) ?: run { + val defaultName = symbol.name.identifier.let { + if (containingClass.isAnnotationType) it else it.abiName() + } + symbol.computeJvmMethodName(defaultName, containingClass, AnnotationUseSiteTarget.PROPERTY) + } + } + } + + override fun getName(): String = _name + + override fun isVarArgs(): Boolean = false + + override val kotlinOrigin: KtDeclaration? get() = containingPropertyDeclaration + + private val _modifierList: PsiModifierList by lazyPub { + return@lazyPub containingPropertySymbolPointer.withSymbol(ktModule) { propertySymbol -> + SymbolLightMemberModifierList( + containingDeclaration = this@SymbolLightAnnotationsMethod, + modifiersBox = InitializedModifiersBox(PsiModifier.PUBLIC, PsiModifier.STATIC), + annotationsBox = GranularAnnotationsBox( + annotationsProvider = SymbolAnnotationsProvider( + ktModule = ktModule, + annotatedSymbolPointer = propertySymbol.createPointer(), + annotationUseSiteTargetFilter = AnnotationUseSiteTarget.PROPERTY.toOptionalFilter(), + ), + additionalAnnotationsProvider = DeprecatedAdditionalAnnotationsProvider + ), + ) + } + } + + override fun getModifierList(): PsiModifierList = _modifierList + + override fun isConstructor(): Boolean = false + + override fun isDeprecated(): Boolean = true + + private val _identifier: PsiIdentifier by lazyPub { + KtLightIdentifier(this, containingPropertyDeclaration) + } + + override fun getNameIdentifier(): PsiIdentifier = _identifier + + override fun getReturnType(): PsiType = PsiType.VOID + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is SymbolLightAnnotationsMethod) return false + return other.ktModule == ktModule && containingPropertyDeclaration == other.containingPropertyDeclaration + } + + override fun hashCode(): Int = containingPropertyDeclaration.hashCode() + + private val _typeParameterList: PsiTypeParameterList? by lazyPub { + hasTypeParameters().ifTrue { + SymbolLightTypeParameterList( + owner = this, + symbolWithTypeParameterPointer = containingPropertySymbolPointer, + ktModule = ktModule, + ktDeclaration = containingPropertyDeclaration, + ) + } + } + + override fun hasTypeParameters(): Boolean = hasTypeParameters(ktModule, containingPropertyDeclaration, containingPropertySymbolPointer) + override fun getTypeParameterList(): PsiTypeParameterList? = _typeParameterList + override fun getTypeParameters(): Array<PsiTypeParameter> = _typeParameterList?.typeParameters ?: PsiTypeParameter.EMPTY_ARRAY + + private val _parametersList by lazyPub { + SymbolLightParameterList( + parent = this@SymbolLightAnnotationsMethod, + callableWithReceiverSymbolPointer = containingPropertySymbolPointer, + parameterPopulator = {}, + ) + } + + override fun getParameterList(): PsiParameterList = _parametersList + + override fun isValid(): Boolean = + super.isValid() && containingPropertySymbolPointer.isValid(ktModule) + + override fun isOverride(): Boolean = false + + override fun getText(): String { + return lightMemberOrigin?.auxiliaryOriginalElement?.text ?: super.getText() + } + + override fun getTextOffset(): Int { + return lightMemberOrigin?.auxiliaryOriginalElement?.textOffset ?: super.getTextOffset() + } + + override fun getTextRange(): TextRange { + return lightMemberOrigin?.auxiliaryOriginalElement?.textRange ?: super.getTextRange() + } +} \ No newline at end of file
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java index 7faf340..e0d57f1 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java
@@ -25,6 +25,12 @@ } @Test + @TestMetadata("allowedTargets.kt") + public void testAllowedTargets() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.kt"); + } + + @Test @TestMetadata("annotationWithSetParamPropertyModifier.kt") public void testAnnotationWithSetParamPropertyModifier() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java index 782d0ae..ac8f9e7 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java
@@ -25,6 +25,12 @@ } @Test + @TestMetadata("allowedTargets.kt") + public void testAllowedTargets() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.kt"); + } + + @Test @TestMetadata("annotationWithSetParamPropertyModifier.kt") public void testAnnotationWithSetParamPropertyModifier() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java index 2c9d62a..06f521d 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java
@@ -25,6 +25,12 @@ } @Test + @TestMetadata("allowedTargets.kt") + public void testAllowedTargets() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.kt"); + } + + @Test @TestMetadata("annotationWithSetParamPropertyModifier.kt") public void testAnnotationWithSetParamPropertyModifier() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java index b44d182..6958ec7 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java
@@ -25,6 +25,12 @@ } @Test + @TestMetadata("allowedTargets.kt") + public void testAllowedTargets() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.kt"); + } + + @Test @TestMetadata("annotationWithSetParamPropertyModifier.kt") public void testAnnotationWithSetParamPropertyModifier() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java index 9267866..2ec35a2 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java
@@ -25,6 +25,12 @@ } @Test + @TestMetadata("allowedTargets.kt") + public void testAllowedTargets() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.kt"); + } + + @Test @TestMetadata("annotationWithSetParamPropertyModifier.kt") public void testAnnotationWithSetParamPropertyModifier() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java index f2eaa66..0a1f559 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java
@@ -25,6 +25,12 @@ } @Test + @TestMetadata("allowedTargets.kt") + public void testAllowedTargets() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.kt"); + } + + @Test @TestMetadata("annotationWithSetParamPropertyModifier.kt") public void testAnnotationWithSetParamPropertyModifier() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt");
diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirRepeatableAnnotationChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirRepeatableAnnotationChecker.kt index 5679ba8..ebb9322 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirRepeatableAnnotationChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirRepeatableAnnotationChecker.kt
@@ -52,11 +52,11 @@ if (annotationClassId.isLocal) continue val annotationClass = session.symbolProvider.getClassLikeSymbolByClassId(annotationClassId) ?: continue - val useSiteTarget = annotation.useSiteTarget + val effectiveUseSiteTarget = annotation.calculatedUseSiteTarget ?: annotation.useSiteTarget val expandedType = annotation.annotationTypeRef.coneType.fullyExpandedType(context.session) val existingTargetsForAnnotation = annotationsMap.getOrPut(expandedType) { arrayListOf() } - val duplicateAnnotation = useSiteTarget in existingTargetsForAnnotation || - existingTargetsForAnnotation.any { (it == null) != (useSiteTarget == null) } + val duplicateAnnotation = effectiveUseSiteTarget in existingTargetsForAnnotation || + existingTargetsForAnnotation.any { (it == null) != (effectiveUseSiteTarget == null) } if (duplicateAnnotation && annotationClass.containsRepeatableAnnotation(session) && @@ -83,7 +83,7 @@ } } - existingTargetsForAnnotation.add(useSiteTarget) + existingTargetsForAnnotation.add(effectiveUseSiteTarget) } if (declaration is FirRegularClass) {
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt index 029c448..9c4f601 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt
@@ -189,7 +189,7 @@ val annotationsMap = hashMapOf<ConeKotlinType, MutableList<AnnotationUseSiteTarget?>>() for (annotation in annotations) { - val useSiteTarget = annotation.useSiteTarget ?: annotationContainer?.getDefaultUseSiteTarget(annotation, context) + val useSiteTarget = annotation.calculatedUseSiteTarget ?: annotation.useSiteTarget ?: annotationContainer?.getDefaultUseSiteTarget(annotation, context) val expandedType = annotation.annotationTypeRef.coneType.fullyExpandedType(context.session) val existingTargetsForAnnotation = annotationsMap.getOrPut(expandedType) { arrayListOf() }
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AnnotationGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AnnotationGenerator.kt index 59726bb..8b1d16a 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AnnotationGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AnnotationGenerator.kt
@@ -40,7 +40,7 @@ } private fun FirAnnotation.target(applicable: List<AnnotationUseSiteTarget>): AnnotationUseSiteTarget? = - useSiteTarget ?: applicable.firstOrNull(useSiteTargetsFromMetaAnnotation(session)::contains) + calculatedUseSiteTarget ?: useSiteTarget ?: applicable.firstOrNull(useSiteTargetsFromMetaAnnotation(session)::contains) companion object { private val propertyTargets = listOf(AnnotationUseSiteTarget.PROPERTY, AnnotationUseSiteTarget.FIELD)
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 96e6d55..662f739 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt
@@ -677,6 +677,7 @@ if (this is FirAnnotationCall) return this return buildAnnotationCall { useSiteTarget = this@toAnnotationCall.useSiteTarget + calculatedUseSiteTarget = this@toAnnotationCall.calculatedUseSiteTarget annotationTypeRef = this@toAnnotationCall.annotationTypeRef val symbol = annotationTypeRef.coneType.fullyExpandedType(session).toSymbol(session) as? FirRegularClassSymbol ?: return null val constructorSymbol = symbol.declarationSymbols.firstIsInstanceOrNull<FirConstructorSymbol>() ?: return null
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt index 1c82e10..8cd8aea 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt
@@ -257,4 +257,4 @@ fun hasLowPriorityAnnotation(annotations: List<FirAnnotation>) = annotations.any { val lookupTag = it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag ?: return@any false lookupTag.classId == LOW_PRIORITY_IN_OVERLOAD_RESOLUTION_CLASS_ID -} +} \ No newline at end of file
diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index 5930611..ecf9b4d 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt
@@ -143,9 +143,10 @@ status = status.copy(), ) annotations += modifiers.annotations.filter { - it.useSiteTarget == null || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY || - it.useSiteTarget == AnnotationUseSiteTarget.FIELD || - it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD + val useSiteTarget = it.calculatedUseSiteTarget ?: it.useSiteTarget + useSiteTarget == null || useSiteTarget == AnnotationUseSiteTarget.PROPERTY || + useSiteTarget == AnnotationUseSiteTarget.FIELD || + useSiteTarget == AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD } val defaultAccessorSource = propertySource?.fakeElement(KtFakeSourceElementKind.DefaultAccessor) getter = FirDefaultPropertyGetter(
diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 95eb14b..519b3fa 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
@@ -600,10 +600,11 @@ val isFromPrimaryConstructor = valueParameterDeclaration == ValueParameterDeclaration.PRIMARY_CONSTRUCTOR for (annotationEntry in annotationEntries) { annotationEntry.convert<FirAnnotation>().takeIf { - !isFromPrimaryConstructor || it.useSiteTarget == null || - it.useSiteTarget == CONSTRUCTOR_PARAMETER || - it.useSiteTarget == RECEIVER || - it.useSiteTarget == FILE + val useSiteTarget = it.calculatedUseSiteTarget ?: it.useSiteTarget + !isFromPrimaryConstructor || useSiteTarget == null || + useSiteTarget == CONSTRUCTOR_PARAMETER || + useSiteTarget == RECEIVER || + useSiteTarget == FILE }?.let { this.annotations += it }
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index 28f8653..f0aba45 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt
@@ -122,7 +122,7 @@ if (result.isPrimary) { for (valueParameter in result.valueParameters) { if (valueParameter.correspondingProperty != null) { - valueParameter.removeDuplicateAnnotationsOfPrimaryConstructorElement() + valueParameter.removeIrrelevantAnnotations() } } } @@ -183,7 +183,7 @@ unboundCyclesInTypeParametersSupertypes(property) if (property.source?.kind == KtFakeSourceElementKind.PropertyFromParameter) { - property.removeDuplicateAnnotationsOfPrimaryConstructorElement() + property.removeIrrelevantAnnotations() } property @@ -398,28 +398,40 @@ } /** - * In a scenario like - * + * Filters annotations by target. + * For example, in the following snippet the annotation may apply to the constructor value parameter, the property or the underlying field: * ``` - * annotation class Ann * class Foo(@Ann val x: String) * ``` - * - * both, the primary ctor value parameter and the property `x` will be annotated with `@Ann`. This is due to the fact, that the - * annotation needs to be resolved in order to determine its annotation targets. We remove annotations from the wrong target if they - * don't explicitly specify the use-site target (in which case they shouldn't have been added to the element in the raw FIR). - * - * For value parameters, we remove the annotation if the targets don't include [AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER]. - * For properties, we remove the annotation, if the targets include [AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER]. + * This ambiguity may be resolved by specifying the use-site explicitly, i.e. `@field:Ann` or by analysing the allowed targets from + * the [kotlin.annotation.Target] meta-annotation. In latter case, the method will assign a use-site target to the corresponding + * annotation. */ - private fun FirVariable.removeDuplicateAnnotationsOfPrimaryConstructorElement() { + private fun FirVariable.removeIrrelevantAnnotations() { val isParameter = this is FirValueParameter - replaceAnnotations(annotations.filter { - it.useSiteTarget != null || - // equivalent to - // CONSTRUCTOR_PARAMETER in targets && isParameter || - // CONSTRUCTOR_PARAMETER !in targets && !isParameter - AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER in it.useSiteTargetsFromMetaAnnotation(session) == isParameter + + replaceAnnotations(annotations.filter { annotation -> + when (annotation.useSiteTarget) { + AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER -> isParameter + AnnotationUseSiteTarget.PROPERTY, AnnotationUseSiteTarget.FIELD -> !isParameter + else -> { + val allowedTargets = annotation.useSiteTargetsFromMetaAnnotation(session) + + val effectiveUseSiteTarget = when { + isParameter && AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER in allowedTargets -> AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER + isParameter -> null + this.source?.kind == KtFakeSourceElementKind.PropertyFromParameter && AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER in allowedTargets -> null + AnnotationUseSiteTarget.PROPERTY in allowedTargets -> AnnotationUseSiteTarget.PROPERTY + AnnotationUseSiteTarget.FIELD in allowedTargets -> AnnotationUseSiteTarget.FIELD + else -> AnnotationUseSiteTarget.PROPERTY + } + + effectiveUseSiteTarget?.let { + annotation.replaceCalculatedUseSiteTarget(it) + true + } ?: false + } + } }) } }
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotation.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotation.kt index bcc395e..75e21a3 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotation.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotation.kt
@@ -22,6 +22,7 @@ abstract override val typeRef: FirTypeRef abstract override val annotations: List<FirAnnotation> abstract val useSiteTarget: AnnotationUseSiteTarget? + abstract val calculatedUseSiteTarget: AnnotationUseSiteTarget? abstract val annotationTypeRef: FirTypeRef abstract val argumentMapping: FirAnnotationArgumentMapping abstract val typeArguments: List<FirTypeProjection> @@ -36,6 +37,8 @@ abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) + abstract fun replaceCalculatedUseSiteTarget(newCalculatedUseSiteTarget: AnnotationUseSiteTarget?) + abstract fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef) abstract fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping)
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotationCall.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotationCall.kt index e6e6b10..68b1e22 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotationCall.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotationCall.kt
@@ -23,6 +23,7 @@ abstract override val typeRef: FirTypeRef abstract override val annotations: List<FirAnnotation> abstract override val useSiteTarget: AnnotationUseSiteTarget? + abstract override val calculatedUseSiteTarget: AnnotationUseSiteTarget? abstract override val annotationTypeRef: FirTypeRef abstract override val typeArguments: List<FirTypeProjection> abstract override val argumentList: FirArgumentList @@ -40,6 +41,8 @@ abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) + abstract override fun replaceCalculatedUseSiteTarget(newCalculatedUseSiteTarget: AnnotationUseSiteTarget?) + abstract override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef) abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirErrorAnnotationCall.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirErrorAnnotationCall.kt index 97910ac..358bd6f 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirErrorAnnotationCall.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirErrorAnnotationCall.kt
@@ -25,6 +25,7 @@ abstract override val typeRef: FirTypeRef abstract override val annotations: List<FirAnnotation> abstract override val useSiteTarget: AnnotationUseSiteTarget? + abstract override val calculatedUseSiteTarget: AnnotationUseSiteTarget? abstract override val annotationTypeRef: FirTypeRef abstract override val typeArguments: List<FirTypeProjection> abstract override val argumentList: FirArgumentList @@ -43,6 +44,8 @@ abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) + abstract override fun replaceCalculatedUseSiteTarget(newCalculatedUseSiteTarget: AnnotationUseSiteTarget?) + abstract override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef) abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAnnotationBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAnnotationBuilder.kt index b89f146..8eb236ce 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAnnotationBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAnnotationBuilder.kt
@@ -30,6 +30,7 @@ class FirAnnotationBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder { override var source: KtSourceElement? = null var useSiteTarget: AnnotationUseSiteTarget? = null + var calculatedUseSiteTarget: AnnotationUseSiteTarget? = null lateinit var annotationTypeRef: FirTypeRef lateinit var argumentMapping: FirAnnotationArgumentMapping val typeArguments: MutableList<FirTypeProjection> = mutableListOf() @@ -38,6 +39,7 @@ return FirAnnotationImpl( source, useSiteTarget, + calculatedUseSiteTarget, annotationTypeRef, argumentMapping, typeArguments.toMutableOrEmpty(),
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAnnotationCallBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAnnotationCallBuilder.kt index 7b46202..23fc4b7 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAnnotationCallBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAnnotationCallBuilder.kt
@@ -38,6 +38,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder { override var source: KtSourceElement? = null var useSiteTarget: AnnotationUseSiteTarget? = null + var calculatedUseSiteTarget: AnnotationUseSiteTarget? = null var annotationTypeRef: FirTypeRef = FirImplicitTypeRefImplWithoutSource val typeArguments: MutableList<FirTypeProjection> = mutableListOf() override var argumentList: FirArgumentList = FirEmptyArgumentList @@ -49,6 +50,7 @@ return FirAnnotationCallImpl( source, useSiteTarget, + calculatedUseSiteTarget, annotationTypeRef, typeArguments.toMutableOrEmpty(), argumentList, @@ -86,6 +88,7 @@ val copyBuilder = FirAnnotationCallBuilder() copyBuilder.source = original.source copyBuilder.useSiteTarget = original.useSiteTarget + copyBuilder.calculatedUseSiteTarget = original.calculatedUseSiteTarget copyBuilder.annotationTypeRef = original.annotationTypeRef copyBuilder.typeArguments.addAll(original.typeArguments) copyBuilder.argumentList = original.argumentList
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorAnnotationCallBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorAnnotationCallBuilder.kt index 836eda8..d3daf9b 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorAnnotationCallBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorAnnotationCallBuilder.kt
@@ -39,6 +39,7 @@ class FirErrorAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder { override var source: KtSourceElement? = null var useSiteTarget: AnnotationUseSiteTarget? = null + var calculatedUseSiteTarget: AnnotationUseSiteTarget? = null var annotationTypeRef: FirTypeRef = FirImplicitTypeRefImplWithoutSource val typeArguments: MutableList<FirTypeProjection> = mutableListOf() override var argumentList: FirArgumentList = FirEmptyArgumentList @@ -50,6 +51,7 @@ return FirErrorAnnotationCallImpl( source, useSiteTarget, + calculatedUseSiteTarget, annotationTypeRef, typeArguments.toMutableOrEmpty(), argumentList,
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt index 91b0b9c..afc6dfc 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt
@@ -29,6 +29,7 @@ internal class FirAnnotationCallImpl( override val source: KtSourceElement?, override val useSiteTarget: AnnotationUseSiteTarget?, + override var calculatedUseSiteTarget: AnnotationUseSiteTarget?, override var annotationTypeRef: FirTypeRef, override var typeArguments: MutableOrEmptyList<FirTypeProjection>, override var argumentList: FirArgumentList, @@ -77,6 +78,10 @@ override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {} + override fun replaceCalculatedUseSiteTarget(newCalculatedUseSiteTarget: AnnotationUseSiteTarget?) { + calculatedUseSiteTarget = newCalculatedUseSiteTarget + } + override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef) { annotationTypeRef = newAnnotationTypeRef }
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationImpl.kt index 826d104..45a5eb8 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationImpl.kt
@@ -25,6 +25,7 @@ internal class FirAnnotationImpl( override val source: KtSourceElement?, override val useSiteTarget: AnnotationUseSiteTarget?, + override var calculatedUseSiteTarget: AnnotationUseSiteTarget?, override var annotationTypeRef: FirTypeRef, override var argumentMapping: FirAnnotationArgumentMapping, override var typeArguments: MutableOrEmptyList<FirTypeProjection>, @@ -63,6 +64,10 @@ override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {} + override fun replaceCalculatedUseSiteTarget(newCalculatedUseSiteTarget: AnnotationUseSiteTarget?) { + calculatedUseSiteTarget = newCalculatedUseSiteTarget + } + override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef) { annotationTypeRef = newAnnotationTypeRef }
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorAnnotationCallImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorAnnotationCallImpl.kt index 9e453c6..33c82db 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorAnnotationCallImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorAnnotationCallImpl.kt
@@ -30,6 +30,7 @@ internal class FirErrorAnnotationCallImpl( override val source: KtSourceElement?, override val useSiteTarget: AnnotationUseSiteTarget?, + override var calculatedUseSiteTarget: AnnotationUseSiteTarget?, override var annotationTypeRef: FirTypeRef, override var typeArguments: MutableOrEmptyList<FirTypeProjection>, override var argumentList: FirArgumentList, @@ -79,6 +80,10 @@ override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {} + override fun replaceCalculatedUseSiteTarget(newCalculatedUseSiteTarget: AnnotationUseSiteTarget?) { + calculatedUseSiteTarget = newCalculatedUseSiteTarget + } + override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef) { annotationTypeRef = newAnnotationTypeRef }
diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index ff7f470..a455709 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt
@@ -515,6 +515,7 @@ annotation.configure { +field("useSiteTarget", annotationUseSiteTargetType, nullable = true) + +field("calculatedUseSiteTarget", annotationUseSiteTargetType, nullable = true, withReplace = true) +field("annotationTypeRef", typeRef, withReplace = true).withTransform() +field("argumentMapping", annotationArgumentMapping, withReplace = true) +typeArguments.withTransform()
diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/AnnotatedPropertyWithSites.fir.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/AnnotatedPropertyWithSites.fir.java new file mode 100644 index 0000000..dfa565a --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/AnnotatedPropertyWithSites.fir.java
@@ -0,0 +1,27 @@ +public final class Test /* Test*/ { + @MyAnnotation5() + @org.jetbrains.annotations.NotNull() + private java.lang.String bar; + + @MyAnnotation() + @org.jetbrains.annotations.NotNull() + public final java.lang.String getBar();// getBar() + + @MyAnnotation2() + public final void setBar(@MyAnnotation3() @org.jetbrains.annotations.NotNull() java.lang.String);// setBar(java.lang.String) + + @MyAnnotation4() + @java.lang.Deprecated() + public static void getBar$annotations();// getBar$annotations() + + @org.jetbrains.annotations.NotNull() + public final kotlin.Unit getFooP(@MyAnnotation7() int);// getFooP(int) + + public Test(@MyAnnotation6() @org.jetbrains.annotations.NotNull() java.lang.String);// .ctor(java.lang.String) + + public final void fooF(@MyAnnotation7() int);// fooF(int) + + public final void fooWithNullableReceiver(@MyAnnotation7() @org.jetbrains.annotations.Nullable() java.lang.Integer, long);// fooWithNullableReceiver(java.lang.Integer, long) + + public final void setFooP(@MyAnnotation7() int, @org.jetbrains.annotations.NotNull() kotlin.Unit);// setFooP(int, kotlin.Unit) +}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/CompanionObject.fir.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/CompanionObject.fir.java new file mode 100644 index 0000000..e7d7f71 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/CompanionObject.fir.java
@@ -0,0 +1,18 @@ +public final class C /* C*/ { + @kotlin.jvm.JvmField() + @org.jetbrains.annotations.NotNull() + public static final java.lang.String foo; + + @org.jetbrains.annotations.NotNull() + public static final C.Companion Companion; + + public C();// .ctor() + + public static final class Companion /* C.Companion*/ { + @java.lang.Deprecated() + @kotlin.jvm.JvmField() + public static void getFoo$annotations();// getFoo$annotations() + + private Companion();// .ctor() + } +}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/SimplePublicField.fir.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/SimplePublicField.fir.java new file mode 100644 index 0000000..f4fea38 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/SimplePublicField.fir.java
@@ -0,0 +1,11 @@ +public final class C /* C*/ { + @kotlin.jvm.JvmField() + @org.jetbrains.annotations.NotNull() + public final java.lang.String foo; + + @java.lang.Deprecated() + @kotlin.jvm.JvmField() + public static void getFoo$annotations();// getFoo$annotations() + + public C();// .ctor() +}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/AnnotationModifiers.fir.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/AnnotationModifiers.fir.java index 3f404b6..d5292bc 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/AnnotationModifiers.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/AnnotationModifiers.fir.java
@@ -4,6 +4,11 @@ @org.jetbrains.annotations.NotNull() private transient volatile java.lang.String c = "" /* initializer type: java.lang.String */; + @java.lang.Deprecated() + @kotlin.jvm.Transient() + @kotlin.jvm.Volatile() + public static void getC$annotations();// getC$annotations() + @kotlin.jvm.Strictfp() @kotlin.jvm.Synchronized() public final synchronized strictfp void f();// f()
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/LateinitProperties.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/LateinitProperties.fir.java index ad803c0..ec0e68f 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/LateinitProperties.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/LateinitProperties.fir.java
@@ -25,6 +25,10 @@ } public static final class Companion /* KotlinClass.Companion*/ { + @java.lang.Deprecated() + @kotlin.jvm.JvmStatic() + public static void getCompanionLateinitStaticVariable$annotations();// getCompanionLateinitStaticVariable$annotations() + @org.jetbrains.annotations.NotNull() public final Custom getCompanionLateinitStaticVariable();// getCompanionLateinitStaticVariable() @@ -39,6 +43,10 @@ } public static final class Companion /* AbstractKotlinClass.Companion*/ { + @java.lang.Deprecated() + @kotlin.jvm.JvmStatic() + public static void getCompanionLateinitStaticVariable$annotations();// getCompanionLateinitStaticVariable$annotations() + @org.jetbrains.annotations.NotNull() public final Custom getCompanionLateinitStaticVariable();// getCompanionLateinitStaticVariable()
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.fir.java new file mode 100644 index 0000000..347b5e0 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.fir.java
@@ -0,0 +1,96 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface AnotherUniversalAnnotation /* AnotherUniversalAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.FIELD}) +public abstract @interface FieldAnnotation /* FieldAnnotation*/ { +} + +public final class MyClass /* MyClass*/ { + @AnotherUniversalAnnotation() + private final int x5; + + @FieldAnnotation() + private final int x1; + + @UniversalAnnotation() + private final int x6; + + private final int x2; + + private final int x3; + + private final int x4; + + private final int x7; + + @AnotherUniversalAnnotation() + @java.lang.Deprecated() + public static void getX7$annotations();// getX7$annotations() + + @PropertyAnnotation() + @java.lang.Deprecated() + public static void getX1$annotations();// getX1$annotations() + + @PropertyOrFieldAnnotation() + @java.lang.Deprecated() + public static void getX2$annotations();// getX2$annotations() + + @UniversalAnnotation() + @java.lang.Deprecated() + public static void getX5$annotations();// getX5$annotations() + + public MyClass(@AnotherUniversalAnnotation() @ParameterAnnotation() @UniversalAnnotation() int, int, @PropertyOrParameterAnnotation() int, @ParameterOrFieldAnnotation() int, int, @AnotherUniversalAnnotation() int, @UniversalAnnotation() int);// .ctor(int, int, int, int, int, int, int) + + public final int getX1();// getX1() + + public final int getX2();// getX2() + + public final int getX3();// getX3() + + public final int getX4();// getX4() + + public final int getX5();// getX5() + + public final int getX6();// getX6() + + public final int getX7();// getX7() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface ParameterAnnotation /* ParameterAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface ParameterOrFieldAnnotation /* ParameterOrFieldAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY}) +public abstract @interface PropertyAnnotation /* PropertyAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD}) +public abstract @interface PropertyOrFieldAnnotation /* PropertyOrFieldAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface PropertyOrParameterAnnotation /* PropertyOrParameterAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface UniversalAnnotation /* UniversalAnnotation*/ { +}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.java new file mode 100644 index 0000000..95244ad --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.java
@@ -0,0 +1,80 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface AnotherUniversalAnnotation /* AnotherUniversalAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.FIELD}) +public abstract @interface FieldAnnotation /* FieldAnnotation*/ { +} + +public final class MyClass /* MyClass*/ { + @AnotherUniversalAnnotation() + private final int x5; + + @FieldAnnotation() + private final int x1; + + @UniversalAnnotation() + private final int x6; + + private final int x2; + + private final int x3; + + private final int x4; + + private final int x7; + + public MyClass(@AnotherUniversalAnnotation() @FieldAnnotation() @ParameterAnnotation() @PropertyAnnotation() @UniversalAnnotation() int, @PropertyOrFieldAnnotation() int, @PropertyOrParameterAnnotation() int, @ParameterOrFieldAnnotation() int, int, @AnotherUniversalAnnotation() int, @UniversalAnnotation() int);// .ctor(int, int, int, int, int, int, int) + + public final int getX1();// getX1() + + public final int getX2();// getX2() + + public final int getX3();// getX3() + + public final int getX4();// getX4() + + public final int getX5();// getX5() + + public final int getX6();// getX6() + + public final int getX7();// getX7() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface ParameterAnnotation /* ParameterAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface ParameterOrFieldAnnotation /* ParameterOrFieldAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY}) +public abstract @interface PropertyAnnotation /* PropertyAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD}) +public abstract @interface PropertyOrFieldAnnotation /* PropertyOrFieldAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface PropertyOrParameterAnnotation /* PropertyOrParameterAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface UniversalAnnotation /* UniversalAnnotation*/ { +}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.kt b/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.kt new file mode 100644 index 0000000..9c1081a --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.kt
@@ -0,0 +1,33 @@ +@Target(AnnotationTarget.PROPERTY) +annotation class PropertyAnnotation + +@Target(AnnotationTarget.FIELD) +annotation class FieldAnnotation + +@Target(AnnotationTarget.VALUE_PARAMETER) +annotation class ParameterAnnotation + +@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FIELD) +annotation class PropertyOrFieldAnnotation + +@Target(AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER) +annotation class PropertyOrParameterAnnotation + +@Target(AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER) +annotation class ParameterOrFieldAnnotation + +@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER) +annotation class UniversalAnnotation + +annotation class AnotherUniversalAnnotation + + +class MyClass( + @PropertyAnnotation @FieldAnnotation @ParameterAnnotation @UniversalAnnotation @AnotherUniversalAnnotation val x1: Int, + @PropertyOrFieldAnnotation val x2: Int, + @PropertyOrParameterAnnotation val x3: Int, + @ParameterOrFieldAnnotation val x4: Int, + @property:UniversalAnnotation @field:AnotherUniversalAnnotation val x5: Int, + @field:UniversalAnnotation @param:AnotherUniversalAnnotation val x6: Int, + @param:UniversalAnnotation @property:AnotherUniversalAnnotation val x7: Int +)
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.lib.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.lib.java new file mode 100644 index 0000000..2f69a8a --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/allowedTargets.lib.java
@@ -0,0 +1,80 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface AnotherUniversalAnnotation /* AnotherUniversalAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.FIELD}) +public abstract @interface FieldAnnotation /* FieldAnnotation*/ { +} + +public final class MyClass /* MyClass*/ { + @AnotherUniversalAnnotation() + private final int x5; + + @FieldAnnotation() + private final int x1; + + @UniversalAnnotation() + private final int x6; + + private final int x2; + + private final int x3; + + private final int x4; + + private final int x7; + + public MyClass(@AnotherUniversalAnnotation() @ParameterAnnotation() @UniversalAnnotation() int, int, @PropertyOrParameterAnnotation() int, @ParameterOrFieldAnnotation() int, int, @AnotherUniversalAnnotation() int, @UniversalAnnotation() int);// .ctor(int, int, int, int, int, int, int) + + public final int getX1();// getX1() + + public final int getX2();// getX2() + + public final int getX3();// getX3() + + public final int getX4();// getX4() + + public final int getX5();// getX5() + + public final int getX6();// getX6() + + public final int getX7();// getX7() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface ParameterAnnotation /* ParameterAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface ParameterOrFieldAnnotation /* ParameterOrFieldAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY}) +public abstract @interface PropertyAnnotation /* PropertyAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD}) +public abstract @interface PropertyOrFieldAnnotation /* PropertyOrFieldAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface PropertyOrParameterAnnotation /* PropertyOrParameterAnnotation*/ { +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER}) +public abstract @interface UniversalAnnotation /* UniversalAnnotation*/ { +}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.fir.java index 7b55c8d..50d32fb 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.fir.java
@@ -59,12 +59,64 @@ public abstract java.lang.String x();// x() } +public final class ClassWithCompanion /* ClassWithCompanion*/ { + @Anno() + @kotlin.jvm.JvmField() + public static final int c = 1 /* initializer type: int */; + + @Anno() + @kotlin.jvm.JvmStatic() + private static final int b = 1 /* initializer type: int */; + + @Anno() + private static final int a = 1 /* initializer type: int */; + + @org.jetbrains.annotations.NotNull() + public static final ClassWithCompanion.CompanionObject CompanionObject; + + private static final int d = 1 /* initializer type: int */; + + public ClassWithCompanion();// .ctor() + + public static final int getB();// getB() + + class CompanionObject ... +} + public static final class Companion /* AnnoWithCompanion.Companion*/ { + @java.lang.Deprecated() + @kotlin.jvm.JvmField() + public static void getX$annotations();// getX$annotations() + private Companion();// .ctor() public final void foo();// foo() } +public static final class CompanionObject /* ClassWithCompanion.CompanionObject*/ { + @Anno() + @java.lang.Deprecated() + @kotlin.jvm.JvmField() + public static void getC$annotations();// getC$annotations() + + @Anno() + @java.lang.Deprecated() + @kotlin.jvm.JvmStatic() + public static void getB$annotations();// getB$annotations() + + @Anno() + @java.lang.Deprecated() + public static void getA$annotations();// getA$annotations() + + private CompanionObject();// .ctor() + + public final int getA();// getA() + + public final int getB();// getB() + + public final int getD();// getD() +} + public final class CtorAnnotations /* CtorAnnotations*/ { @org.jetbrains.annotations.NotNull() private final java.lang.String x; @@ -103,19 +155,35 @@ private final java.lang.String bar; @org.jetbrains.annotations.NotNull() + private final java.lang.String baz; + + @org.jetbrains.annotations.NotNull() + private final java.lang.String prop; + + @org.jetbrains.annotations.NotNull() private final java.lang.String quux; @Ann() + @java.lang.Deprecated() + public static void getProp$annotations();// getProp$annotations() + + @Ann() @org.jetbrains.annotations.NotNull() public final java.lang.String getBar();// getBar() @org.jetbrains.annotations.NotNull() + public final java.lang.String getBaz();// getBaz() + + @org.jetbrains.annotations.NotNull() public final java.lang.String getFoo();// getFoo() @org.jetbrains.annotations.NotNull() + public final java.lang.String getProp();// getProp() + + @org.jetbrains.annotations.NotNull() public final java.lang.String getQuux();// getQuux() - public Example(@org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() java.lang.String, @Ann() @org.jetbrains.annotations.NotNull() java.lang.String);// .ctor(java.lang.String, java.lang.String, java.lang.String) + public Example(@org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() java.lang.String, @Ann() @org.jetbrains.annotations.NotNull() java.lang.String, @Ann() @org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() java.lang.String);// .ctor(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) } @Anno() @@ -127,6 +195,10 @@ @Anno(p = "f") public final void f(@Anno() @org.jetbrains.annotations.NotNull() java.lang.String);// f(java.lang.String) + @Anno(p = "p") + @java.lang.Deprecated() + public static void getProp$annotations();// getProp$annotations() + @org.jetbrains.annotations.NotNull() public final java.lang.String getProp();// getProp() @@ -167,6 +239,33 @@ public MyClass();// .ctor() } +public final class PropertyAnnotations /* PropertyAnnotations*/ { + @Anno() + private final int a = 1 /* initializer type: int */; + + @Anno() + private final int c = 1 /* initializer type: int */; + + private final int b = 1 /* initializer type: int */; + + @Anno() + @java.lang.Deprecated() + public static void getA$annotations();// getA$annotations() + + @Anno() + @java.lang.Deprecated() + public static void getB$annotations();// getB$annotations() + + @Anno() + public final int getC();// getC() + + public PropertyAnnotations();// .ctor() + + public final int getA();// getA() + + public final int getB();// getB() +} + @java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface ReplaceWith /* ReplaceWith*/ { public abstract java.lang.String expression();// expression()
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.java index 5d7c7f0..997f1e4 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.java
@@ -59,12 +59,42 @@ public abstract java.lang.String x();// x() } +public final class ClassWithCompanion /* ClassWithCompanion*/ { + @kotlin.jvm.JvmField() + public static final int c; + + @org.jetbrains.annotations.NotNull() + public static final ClassWithCompanion.CompanionObject CompanionObject; + + private static final int a; + + private static final int b; + + private static final int d; + + public ClassWithCompanion();// .ctor() + + public static final int getB();// getB() + + class CompanionObject ... +} + public static final class Companion /* AnnoWithCompanion.Companion*/ { private Companion();// .ctor() public final void foo();// foo() } +public static final class CompanionObject /* ClassWithCompanion.CompanionObject*/ { + private CompanionObject();// .ctor() + + public final int getA();// getA() + + public final int getB();// getB() + + public final int getD();// getD() +} + public final class CtorAnnotations /* CtorAnnotations*/ { @org.jetbrains.annotations.NotNull() private final java.lang.String x; @@ -103,6 +133,12 @@ private final java.lang.String bar; @org.jetbrains.annotations.NotNull() + private final java.lang.String baz; + + @org.jetbrains.annotations.NotNull() + private final java.lang.String prop; + + @org.jetbrains.annotations.NotNull() private final java.lang.String quux; @Ann() @@ -110,12 +146,18 @@ public final java.lang.String getBar();// getBar() @org.jetbrains.annotations.NotNull() + public final java.lang.String getBaz();// getBaz() + + @org.jetbrains.annotations.NotNull() public final java.lang.String getFoo();// getFoo() @org.jetbrains.annotations.NotNull() + public final java.lang.String getProp();// getProp() + + @org.jetbrains.annotations.NotNull() public final java.lang.String getQuux();// getQuux() - public Example(@org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() java.lang.String, @Ann() @org.jetbrains.annotations.NotNull() java.lang.String);// .ctor(java.lang.String, java.lang.String, java.lang.String) + public Example(@org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() java.lang.String, @Ann() @org.jetbrains.annotations.NotNull() java.lang.String, @Ann() @org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() java.lang.String);// .ctor(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) } @Anno() @@ -166,6 +208,24 @@ public MyClass();// .ctor() } +public final class PropertyAnnotations /* PropertyAnnotations*/ { + @Anno() + private final int c; + + private final int a; + + private final int b; + + @Anno() + public final int getC();// getC() + + public PropertyAnnotations();// .ctor() + + public final int getA();// getA() + + public final int getB();// getB() +} + @java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface ReplaceWith /* ReplaceWith*/ { public abstract java.lang.String expression();// expression()
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.kt b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.kt index 126ed2b..b72a3e4 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.kt +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.kt
@@ -58,10 +58,42 @@ @Ann(String::class, Int::class) class MyClass -class Example(@field:Ann val foo: String, // annotate Java field - @get:Ann val bar: String, // annotate Java getter - @param:Ann val quux: String) // annotate Java constructor parameter +class Example(@field:Ann val foo: String, // annotate Java field + @get:Ann val bar: String, // annotate Java getter + @param:Ann val quux: String, // annotate Java constructor parameter + @Ann val baz: String, // annotate Java constructor parameter implicitly + @property:Ann val prop: String) // annotate Java property class CtorAnnotations(@Anno val x: String, @param:Anno val y: String, val z: String) +class PropertyAnnotations { + @Anno + val a = 1 + + @property:Anno + val b = 1 + + @field:Anno + @get:Anno + @set:Anno + val c = 1 // no getC$annotations +} + +class ClassWithCompanion { + companion object CompanionObject { + @Anno + val a = 1 + + @Anno + @JvmStatic + val b = 1 + + @Anno + @JvmField + val c = 1 + + val d = 1 + } +} + // COMPILATION_ERRORS \ No newline at end of file
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/jvmField.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/jvmField.fir.java index 3489ad7..48e1bf3 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/jvmField.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/jvmField.fir.java
@@ -5,4 +5,12 @@ @kotlin.jvm.JvmField() public static int b = 1 /* initializer type: int */; + + @java.lang.Deprecated() + @kotlin.jvm.JvmField() + public static void getA$annotations();// getA$annotations() + + @java.lang.Deprecated() + @kotlin.jvm.JvmField() + public static void getB$annotations();// getB$annotations() }
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/fieldModifiers.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/fieldModifiers.java index 5b79873..cc71f00 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/fieldModifiers.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/fieldModifiers.java
@@ -8,6 +8,11 @@ @kotlin.jvm.Volatile() private static transient volatile int implicit = 0 /* initializer type: int */; + @java.lang.Deprecated() + @kotlin.jvm.Transient() + @kotlin.jvm.Volatile() + public static void getImplicit$annotations();// getImplicit$annotations() + @org.jetbrains.annotations.NotNull() public static final java.lang.String getExplicit();// getExplicit()
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/jvmSynthetic.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/jvmSynthetic.fir.java index e47de9bb..38a1c6b 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/jvmSynthetic.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/jvmSynthetic.fir.java
@@ -3,6 +3,15 @@ public A f; + @java.lang.Deprecated() + @kotlin.jvm.JvmField() + @kotlin.jvm.JvmSynthetic() + public static void getY$annotations();// getY$annotations() + + @java.lang.Deprecated() + @kotlin.jvm.JvmSynthetic() + public static void getX$annotations();// getX$annotations() + public A();// .ctor() public final int getX();// getX()
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/objects.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/objects.java index 95ed4a0..3fe862f 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/objects.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/objects.java
@@ -78,6 +78,10 @@ } public static final class Companion /* C.Companion*/ { + @java.lang.Deprecated() + @kotlin.jvm.JvmStatic() + public static void getX$annotations();// getX$annotations() + @kotlin.jvm.JvmStatic() @org.jetbrains.annotations.NotNull() public final java.lang.String getC(@org.jetbrains.annotations.NotNull() I);// getC(I) @@ -157,6 +161,10 @@ @org.jetbrains.annotations.NotNull() public static final Obj INSTANCE; + @java.lang.Deprecated() + @kotlin.jvm.JvmStatic() + public static void getX$annotations();// getX$annotations() + @java.lang.Override() public void run();// run()
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirSerializer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirSerializer.kt index 5b86ac1..f78acda 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirSerializer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirSerializer.kt
@@ -175,7 +175,7 @@ // inspired by KlibMetadataSerializerExtension.serializeProperty declarationFileId(property)?.let { proto.setExtension(KlibMetadataProtoBuf.propertyFile, it) } property.nonSourceAnnotations(session).forEach { - val extension = when (it.useSiteTarget) { // Revise this code after KT-54385 + val extension = when (it.calculatedUseSiteTarget ?: it.useSiteTarget) { // Revise this code after KT-54385 AnnotationUseSiteTarget.FIELD -> KlibMetadataProtoBuf.propertyBackingFieldAnnotation AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD -> KlibMetadataProtoBuf.propertyDelegatedFieldAnnotation else -> KlibMetadataProtoBuf.propertyAnnotation
diff --git a/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizePropertyChecker.kt b/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizePropertyChecker.kt index ac71315..20562ae 100644 --- a/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizePropertyChecker.kt +++ b/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizePropertyChecker.kt
@@ -155,7 +155,7 @@ private fun List<FirAnnotation>.hasIgnoredOnParcel(): Boolean { return this.any { if (it.annotationTypeRef.coneType.classId !in IGNORED_ON_PARCEL_CLASS_IDS) return@any false - val target = it.useSiteTarget + val target = it.calculatedUseSiteTarget ?: it.useSiteTarget target == null || target == AnnotationUseSiteTarget.PROPERTY || target == AnnotationUseSiteTarget.PROPERTY_GETTER } }