[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:
committed by
Space Team
parent
24041bf96d
commit
3a7602a38f
+16
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+25
-10
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user