diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolAnnotationsProvider.kt index f492d45cd31..0db0c78a4b2 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolAnnotationsProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolAnnotationsProvider.kt @@ -11,31 +11,40 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.project.structure.KtModule +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.light.classes.symbol.withSymbol import org.jetbrains.kotlin.name.ClassId internal class SymbolAnnotationsProvider( private val ktModule: KtModule, - private val annotatedSymbolPointer: KtSymbolPointer + private val annotatedSymbolPointer: KtSymbolPointer, + private val annotationUseSiteTarget: AnnotationUseSiteTarget? = null, + private val acceptAnnotationsWithoutSite: Boolean = false, ) : AnnotationsProvider { private inline fun withAnnotatedSymbol(crossinline action: context(KtAnalysisSession) (KtAnnotatedSymbol) -> T): T = annotatedSymbolPointer.withSymbol(ktModule, action) override fun annotationOverviews(): List = withAnnotatedSymbol { annotatedSymbol -> - annotatedSymbol.annotationOverviews + annotatedSymbol.annotationOverviews.filter { + it.useSiteTarget == annotationUseSiteTarget || acceptAnnotationsWithoutSite && it.useSiteTarget == null + } } override fun get(classId: ClassId): Collection = withAnnotatedSymbol { annotatedSymbol -> - annotatedSymbol.annotationsByClassId(classId) + annotatedSymbol.annotationsByClassId(classId).filter { + it.useSiteTarget == annotationUseSiteTarget || acceptAnnotationsWithoutSite && it.useSiteTarget == null + } } override fun contains(classId: ClassId): Boolean = withAnnotatedSymbol { annotatedSymbol -> - annotatedSymbol.hasAnnotation(classId) + annotatedSymbol.hasAnnotation(classId, annotationUseSiteTarget, acceptAnnotationsWithoutSite) } override fun isTheSameAs(other: Any?): Boolean = other === this || other is SymbolAnnotationsProvider<*> && other.ktModule == ktModule && + other.annotationUseSiteTarget == annotationUseSiteTarget && + other.acceptAnnotationsWithoutSite == acceptAnnotationsWithoutSite && annotatedSymbolPointer.pointsToTheSameSymbolAs(other.annotatedSymbolPointer) override fun ownerClassId(): ClassId? = withAnnotatedSymbol { annotatedSymbol -> diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt index 00a9e7d5a1e..b28f6ed1c54 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt @@ -15,8 +15,11 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.codegen.AsmUtil +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.annotations.LazyAnnotationsBox +import org.jetbrains.kotlin.light.classes.symbol.annotations.NullabilityAnnotationsProvider +import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolAnnotationsProvider import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList import org.jetbrains.kotlin.psi.KtParameter @@ -69,14 +72,17 @@ internal class SymbolLightParameterForReceiver private constructor( SymbolLightClassModifierList( containingDeclaration = this, annotationsBox = LazyAnnotationsBox( - annotationsProvider = SymbolAnnotationsProvider(ktModule, receiverPointer), - additionalAnnotationsProvider = CompositeAdditionalAnnotationsProvider( - NullabilityAnnotationsProvider { - withReceiverSymbol { receiver -> - receiver.type.nullabilityType - } - }, - ) + annotationsProvider = SymbolAnnotationsProvider( + ktModule = ktModule, + annotatedSymbolPointer = receiverPointer, + annotationUseSiteTarget = AnnotationUseSiteTarget.RECEIVER, + acceptAnnotationsWithoutSite = true, + ), + additionalAnnotationsProvider = NullabilityAnnotationsProvider { + withReceiverSymbol { receiver -> + receiver.type.nullabilityType + } + }, ), ) }