[AA] introduce KtAnnotationApplication

^KT-56046
This commit is contained in:
Dmitrii Gridin
2023-01-27 17:22:14 +01:00
committed by Space Team
parent 59f07c2197
commit 6e25b45f7d
27 changed files with 170 additions and 166 deletions
@@ -118,7 +118,7 @@ private fun SymbolLightLazyAnnotation.tryConvertToRetentionJavaAnnotation(
)
private fun SymbolLightJavaAnnotation.computeJavaRetentionArguments(): List<KtNamedAnnotationValue> {
val argumentWithKotlinRetention = originalLightAnnotation.annotationApplication
val argumentWithKotlinRetention = originalLightAnnotation.annotationApplicationWithArgumentsInfo
.value
.arguments
.firstOrNull {
@@ -203,7 +203,7 @@ private fun SymbolLightLazyAnnotation.tryConvertToTargetJavaAnnotation(
)
private fun SymbolLightJavaAnnotation.computeTargetJavaAnnotationArguments(): List<KtNamedAnnotationValue> {
val allowedKotlinTargets = originalLightAnnotation.annotationApplication
val allowedKotlinTargets = originalLightAnnotation.annotationApplicationWithArgumentsInfo
.value
.arguments
.firstOrNull()
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.light.classes.symbol.annotations
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationOverview
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationInfo
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo
import org.jetbrains.kotlin.name.ClassId
internal sealed interface AnnotationsProvider {
fun annotationOverviews(): List<KtAnnotationOverview>
operator fun get(classId: ClassId): Collection<KtAnnotationApplication>
fun annotationInfos(): List<KtAnnotationApplicationInfo>
operator fun get(classId: ClassId): Collection<KtAnnotationApplicationWithArgumentsInfo>
operator fun contains(classId: ClassId): Boolean
fun isTheSameAs(other: Any?): Boolean
fun ownerClassId(): ClassId?
@@ -5,20 +5,20 @@
package org.jetbrains.kotlin.light.classes.symbol.annotations
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationOverview
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationInfo
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo
import org.jetbrains.kotlin.name.ClassId
internal class CompositeAnnotationsProvider(val providers: Collection<AnnotationsProvider>) : AnnotationsProvider {
constructor(vararg providers: AnnotationsProvider) : this(providers.toList())
override fun annotationOverviews(): List<KtAnnotationOverview> = buildList {
override fun annotationInfos(): List<KtAnnotationApplicationInfo> = buildList {
for (provider in providers) {
addAll(provider.annotationOverviews())
addAll(provider.annotationInfos())
}
}
override fun get(classId: ClassId): Collection<KtAnnotationApplication> = buildList {
override fun get(classId: ClassId): Collection<KtAnnotationApplicationWithArgumentsInfo> = buildList {
for (provider in providers) {
addAll(provider[classId])
}
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.light.classes.symbol.annotations
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationOverview
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationInfo
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo
import org.jetbrains.kotlin.name.ClassId
internal object EmptyAnnotationsProvider : AnnotationsProvider {
override fun annotationOverviews(): List<KtAnnotationOverview> = emptyList()
override fun get(classId: ClassId): Collection<KtAnnotationApplication> = emptyList()
override fun annotationInfos(): List<KtAnnotationApplicationInfo> = emptyList()
override fun get(classId: ClassId): Collection<KtAnnotationApplicationWithArgumentsInfo> = emptyList()
override fun contains(classId: ClassId): Boolean = false
override fun isTheSameAs(other: Any?): Boolean = this === other
override fun ownerClassId(): ClassId? = null
@@ -24,9 +24,9 @@ internal class LazyAnnotationsBox(
override fun annotations(owner: PsiModifierList): Array<PsiAnnotation> {
annotationsArray.get()?.let { return it }
val annotations = annotationsProvider.annotationOverviews().mapNotNullTo(SmartList<PsiAnnotation>()) {
it.classId?.let { classId ->
SymbolLightLazyAnnotation(classId, annotationsProvider, it, owner)
val annotations = annotationsProvider.annotationInfos().mapNotNullTo(SmartList<PsiAnnotation>()) { applicationInfo ->
applicationInfo.classId?.let { _ ->
SymbolLightLazyAnnotation(annotationsProvider, applicationInfo, owner)
}
}
@@ -73,13 +73,7 @@ internal class LazyAnnotationsBox(
val specialAnnotationClassId = specialAnnotationsList[qualifiedName]
val specialAnnotation = if (specialAnnotationClassId != null) {
val annotationApplication = annotationsProvider[specialAnnotationClassId].firstOrNull() ?: return null
SymbolLightLazyAnnotation(
specialAnnotationClassId,
annotationsProvider,
annotationApplication,
owner,
)
SymbolLightLazyAnnotation(annotationsProvider, annotationApplication, owner)
} else if (withAdditionalAnnotations) {
additionalAnnotationsProvider.findAdditionalAnnotation(this, qualifiedName, owner)
} else {
@@ -24,13 +24,13 @@ internal class SymbolAnnotationsProvider<T : KtAnnotatedSymbol>(
private inline fun <T> withAnnotatedSymbol(crossinline action: context(KtAnalysisSession) (KtAnnotatedSymbol) -> T): T =
annotatedSymbolPointer.withSymbol(ktModule, action)
override fun annotationOverviews(): List<KtAnnotationOverview> = withAnnotatedSymbol { annotatedSymbol ->
annotatedSymbol.annotationOverviews.filter {
override fun annotationInfos(): List<KtAnnotationApplicationInfo> = withAnnotatedSymbol { annotatedSymbol ->
annotatedSymbol.annotationInfos.filter {
it.useSiteTarget == annotationUseSiteTarget || acceptAnnotationsWithoutSite && it.useSiteTarget == null
}
}
override fun get(classId: ClassId): Collection<KtAnnotationApplication> = withAnnotatedSymbol { annotatedSymbol ->
override fun get(classId: ClassId): Collection<KtAnnotationApplicationWithArgumentsInfo> = withAnnotatedSymbol { annotatedSymbol ->
annotatedSymbol.annotationsByClassId(classId).filter {
it.useSiteTarget == annotationUseSiteTarget || acceptAnnotationsWithoutSite && it.useSiteTarget == null
}
@@ -8,64 +8,39 @@ package org.jetbrains.kotlin.light.classes.symbol.annotations
import com.intellij.psi.PsiAnnotationParameterList
import com.intellij.psi.PsiModifierList
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationOverview
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtCallElement
internal class SymbolLightLazyAnnotation private constructor(
private val classId: ClassId,
internal class SymbolLightLazyAnnotation(
val annotationsProvider: AnnotationsProvider,
private val annotationOverview: KtAnnotationOverview?,
private val specialAnnotationApplication: KtAnnotationApplication?,
private val annotationApplication: KtAnnotationApplication,
owner: PsiModifierList,
) : SymbolLightAbstractAnnotation(owner) {
init {
require(annotationOverview != null || specialAnnotationApplication != null)
requireNotNull(annotationApplication.classId)
}
private val classId: ClassId get() = annotationApplication.classId!!
private val fqName: FqName = classId.asSingleFqName()
val annotationApplication: Lazy<KtAnnotationApplication> = specialAnnotationApplication?.let(::lazyOf) ?: lazyPub {
val applications = annotationsProvider[classId]
applications.find { it.index == annotationOverview?.index }
?: error("expected index: ${annotationOverview?.index}, actual indices: ${applications.map { it.index }}")
}
val annotationApplicationWithArgumentsInfo: Lazy<KtAnnotationApplicationWithArgumentsInfo> =
(annotationApplication as? KtAnnotationApplicationWithArgumentsInfo)?.let(::lazyOf) ?: lazyPub {
val applications = annotationsProvider[classId]
applications.find { it.index == annotationApplication.index }
?: error("expected application: ${annotationApplication}, actual indices: ${applications.map { it.index }}")
}
constructor(
classId: ClassId,
annotationsProvider: AnnotationsProvider,
annotationOverview: KtAnnotationOverview,
owner: PsiModifierList,
) : this(
classId = classId,
annotationsProvider = annotationsProvider,
annotationOverview = annotationOverview,
specialAnnotationApplication = null,
owner = owner,
)
constructor(
classId: ClassId,
annotationsProvider: AnnotationsProvider,
annotationApplication: KtAnnotationApplication,
owner: PsiModifierList,
) : this(
classId = classId,
annotationsProvider = annotationsProvider,
annotationOverview = null,
specialAnnotationApplication = annotationApplication,
owner = owner,
)
override val kotlinOrigin: KtCallElement? get() = annotationApplication.value.psi
override val kotlinOrigin: KtCallElement? get() = annotationApplicationWithArgumentsInfo.value.psi
override fun getQualifiedName(): String = fqName.asString()
private val _parameterList: PsiAnnotationParameterList by lazyPub {
if (annotationOverview?.hasArguments == true || !specialAnnotationApplication?.arguments.isNullOrEmpty()) {
SymbolLightLazyAnnotationParameterList(this, lazyPub { annotationApplication.value.arguments })
if (annotationApplication.isCallWithArguments) {
SymbolLightLazyAnnotationParameterList(this, lazyPub { annotationApplicationWithArgumentsInfo.value.arguments })
} else {
SymbolLightEmptyAnnotationParameterList(this)
}
@@ -76,8 +51,7 @@ internal class SymbolLightLazyAnnotation private constructor(
override fun equals(other: Any?): Boolean = this === other ||
other is SymbolLightLazyAnnotation &&
other.fqName == fqName &&
other.annotationOverview == annotationOverview &&
other.specialAnnotationApplication == specialAnnotationApplication &&
other.annotationApplication == annotationApplication &&
annotationsProvider.isTheSameAs(other.annotationsProvider) &&
other.parent == parent
@@ -72,7 +72,7 @@ internal fun KtAnnotatedSymbol.findAnnotation(
classId: ClassId,
annotationUseSiteTarget: AnnotationUseSiteTarget?,
acceptAnnotationsWithoutUseSite: Boolean = false,
): KtAnnotationApplication? {
): KtAnnotationApplicationWithArgumentsInfo? {
if (!hasAnnotation(classId, annotationUseSiteTarget, acceptAnnotationsWithoutUseSite)) return null
return annotations.find {