[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,6 +6,7 @@
package org.jetbrains.kotlin.analysis.api.fir
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationOverview
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
@@ -13,7 +14,9 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.arguments
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirNamedReference
@@ -65,15 +68,24 @@ internal fun ConeDiagnostic.getCandidateSymbols(): Collection<FirBasedSymbol<*>>
else -> emptyList()
}
internal fun FirAnnotation.toKtAnnotationApplication(useSiteSession: FirSession, index: Int): KtAnnotationApplication {
return KtAnnotationApplication(
toAnnotationClassId(useSiteSession),
psi as? KtCallElement,
useSiteTarget,
FirAnnotationValueConverter.toNamedConstantValue(
mapAnnotationParameters(this),
useSiteSession,
),
index,
)
}
internal fun FirAnnotation.toKtAnnotationApplication(
useSiteSession: FirSession,
index: Int,
): KtAnnotationApplication = KtAnnotationApplication(
classId = toAnnotationClassId(useSiteSession),
psi = psi as? KtCallElement,
useSiteTarget = useSiteTarget,
arguments = FirAnnotationValueConverter.toNamedConstantValue(
mapAnnotationParameters(this),
useSiteSession,
),
index = index,
)
internal fun FirAnnotation.toKtAnnotationOverview(useSiteSession: FirSession, index: Int): KtAnnotationOverview = KtAnnotationOverview(
classId = toAnnotationClassId(useSiteSession),
psi = psi as? KtCallElement,
useSiteTarget = useSiteTarget,
hasArguments = this is FirAnnotationCall && arguments.isNotEmpty(),
index = index,
)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.analysis.api.fir.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.impl.base.annotations.KtEmptyAnnotationsList
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
@@ -25,6 +26,11 @@ internal class KtFirAnnotationListForDeclaration private constructor(
annotations(firSymbol, useSiteSession)
}
override val annotationOverviews: List<KtAnnotationOverview>
get() = withValidityAssertion {
annotationOverviews(firSymbol, useSiteSession)
}
override fun hasAnnotation(
classId: ClassId,
useSiteTarget: AnnotationUseSiteTarget?,
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.analysis.api.fir.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.impl.base.annotations.KtEmptyAnnotationsList
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
@@ -22,12 +23,16 @@ internal class KtFirAnnotationListForReceiverParameter private constructor(
private val useSiteSession: FirSession,
override val token: KtLifetimeToken,
) : KtAnnotationsList() {
override val annotations: List<KtAnnotationApplication>
get() = withValidityAssertion {
annotations(firCallableSymbol, useSiteSession, receiverParameter)
}
override val annotationOverviews: List<KtAnnotationOverview>
get() = withValidityAssertion {
annotationOverviews(firCallableSymbol, useSiteSession, receiverParameter)
}
override fun hasAnnotation(
classId: ClassId,
useSiteTarget: AnnotationUseSiteTarget?,
@@ -6,8 +6,10 @@
package org.jetbrains.kotlin.analysis.api.fir.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.fir.toKtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.fir.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
@@ -36,6 +38,13 @@ internal class KtFirAnnotationListForType private constructor(
}
}
override val annotationOverviews: List<KtAnnotationOverview>
get() = withValidityAssertion {
coneType.customAnnotationsWithLazyResolve(FirResolvePhase.TYPES).mapIndexed { index, annotation ->
annotation.toKtAnnotationOverview(useSiteSession, index)
}
}
override fun hasAnnotation(
classId: ClassId,
useSiteTarget: AnnotationUseSiteTarget?,
@@ -6,7 +6,9 @@
package org.jetbrains.kotlin.analysis.api.fir.annotations
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationOverview
import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationOverview
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
import org.jetbrains.kotlin.analysis.utils.errors.checkWithAttachmentBuilder
import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry
@@ -64,6 +66,14 @@ internal fun annotations(
annotation.toKtAnnotationApplication(useSiteSession, index)
}
internal fun annotationOverviews(
firSymbol: FirBasedSymbol<*>,
useSiteSession: FirSession,
annotationContainer: FirAnnotationContainer = firSymbol.fir,
): List<KtAnnotationOverview> = annotationContainer.resolvedAnnotationsWithClassIds(firSymbol).mapIndexed { index, annotation ->
annotation.toKtAnnotationOverview(useSiteSession, index)
}
internal fun annotationClassIds(
firSymbol: FirBasedSymbol<*>,
useSiteSession: FirSession,