[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
@@ -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 +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
-1
@@ -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?,
|
||||
|
||||
+9
@@ -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?,
|
||||
|
||||
+10
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user