[AA] KtAnnotationsList: introduce 'annotationOverviews'

it provides a solution for several problems with redundant resolve.
It is a more powerful tool than 'annotationClassIds'

^KT-56046
This commit is contained in:
Dmitrii Gridin
2023-01-26 14:54:27 +01:00
committed by Space Team
parent 24041bf96d
commit 3a7602a38f
11 changed files with 166 additions and 27 deletions
@@ -6,10 +6,12 @@
package org.jetbrains.kotlin.analysis.api.descriptors.annotations
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationOverview
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtAnnotationOverview
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
@@ -30,8 +32,20 @@ internal class KtFe10AnnotationsList private constructor(
override val annotations: List<KtAnnotationApplication>
get() = withValidityAssertion {
fe10Annotations.mapIndexedNotNull { index, annotation ->
if (annotation.annotationClass.classId in annotationsToIgnore) null
else annotation.toKtAnnotationApplication(analysisContext, index)
if (annotation.annotationClass.classId in annotationsToIgnore)
null
else
annotation.toKtAnnotationApplication(analysisContext, index)
}
}
override val annotationOverviews: List<KtAnnotationOverview>
get() = withValidityAssertion {
fe10Annotations.mapIndexedNotNull { index, annotation ->
if (annotation.annotationClass.classId in annotationsToIgnore)
null
else
annotation.toKtAnnotationOverview(index)
}
}
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.impl.*
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
@@ -608,27 +609,41 @@ internal fun createKtInitializerValue(
return KtNonConstantInitializerValue(initializer)
}
internal fun AnnotationDescriptor.toKtAnnotationApplication(analysisContext: Fe10AnalysisContext, index: Int): KtAnnotationApplication {
return KtAnnotationApplication(
annotationClass?.maybeLocalClassId,
(source as? PsiSourceElement)?.psi as? KtCallElement,
(this as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget?.getAnnotationUseSiteTarget(),
getKtNamedAnnotationArguments(analysisContext),
index,
)
}
internal fun AnnotationDescriptor.toKtAnnotationApplication(
analysisContext: Fe10AnalysisContext,
index: Int,
): KtAnnotationApplication = KtAnnotationApplication(
classId = classIdIfNonLocal,
psi = psi,
useSiteTarget = useSiteTarget,
arguments = getKtNamedAnnotationArguments(analysisContext),
index = index,
)
internal fun AnnotationDescriptor.toKtAnnotationOverview(index: Int): KtAnnotationOverview = KtAnnotationOverview(
classId = classIdIfNonLocal,
psi = psi,
useSiteTarget = useSiteTarget,
hasArguments = allValueArguments.isNotEmpty(),
index = index,
)
private val AnnotationDescriptor.psi: KtCallElement? get() = (source as? PsiSourceElement)?.psi as? KtCallElement
private val AnnotationDescriptor.classIdIfNonLocal: ClassId? get() = annotationClass?.maybeLocalClassId
private val AnnotationDescriptor.useSiteTarget: AnnotationUseSiteTarget?
get() = (this as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget?.getAnnotationUseSiteTarget()
internal fun AnnotationDescriptor.getKtNamedAnnotationArguments(analysisContext: Fe10AnalysisContext): List<KtNamedAnnotationValue> =
allValueArguments.map { (name, value) ->
KtNamedAnnotationValue(name, value.toKtAnnotationValue(analysisContext, index = -1))
}
internal fun CallableDescriptor.createContextReceivers(
analysisContext: Fe10AnalysisContext
): List<KtContextReceiver> {
return contextReceiverParameters.map { createContextReceiver(it, analysisContext) }
}
internal fun ClassDescriptor.createContextReceivers(
analysisContext: Fe10AnalysisContext
): List<KtContextReceiver> {