[AA] KtAnnotationApplication: make index nullable

^KT-56046
This commit is contained in:
Dmitrii Gridin
2023-02-01 20:51:50 +01:00
committed by Space Team
parent 50711d5003
commit 379044f2c8
6 changed files with 14 additions and 37 deletions
@@ -429,18 +429,18 @@ internal tailrec fun KotlinBuiltIns.areSameArrayTypeIgnoringProjections(left: Ko
internal fun List<ConstantValue<*>>.expandArrayAnnotationValue( internal fun List<ConstantValue<*>>.expandArrayAnnotationValue(
containingArrayType: KotlinType, containingArrayType: KotlinType,
analysisContext: Fe10AnalysisContext, analysisContext: Fe10AnalysisContext,
): List<KtAnnotationValue> = flatMapIndexed { index: Int, constantValue: ConstantValue<*> -> ): List<KtAnnotationValue> = flatMap { constantValue: ConstantValue<*> ->
val constantType = constantValue.getType(analysisContext.resolveSession.moduleDescriptor) val constantType = constantValue.getType(analysisContext.resolveSession.moduleDescriptor)
if (analysisContext.builtIns.areSameArrayTypeIgnoringProjections(containingArrayType, constantType)) { if (analysisContext.builtIns.areSameArrayTypeIgnoringProjections(containingArrayType, constantType)) {
// If an element in the array has the same type as the containing array, it's a spread component that needs // If an element in the array has the same type as the containing array, it's a spread component that needs
// to be expanded here. (It should have the array element type instead.) // to be expanded here. (It should have the array element type instead.)
(constantValue as ArrayValue).value.expandArrayAnnotationValue(containingArrayType, analysisContext) (constantValue as ArrayValue).value.expandArrayAnnotationValue(containingArrayType, analysisContext)
} else { } else {
listOf(constantValue.toKtAnnotationValue(analysisContext, index)) listOf(constantValue.toKtAnnotationValue(analysisContext))
} }
} }
internal fun ConstantValue<*>.toKtAnnotationValue(analysisContext: Fe10AnalysisContext, index: Int): KtAnnotationValue { internal fun ConstantValue<*>.toKtAnnotationValue(analysisContext: Fe10AnalysisContext): KtAnnotationValue {
return when (this) { return when (this) {
is ArrayValue -> { is ArrayValue -> {
val arrayType = getType(analysisContext.resolveSession.moduleDescriptor) val arrayType = getType(analysisContext.resolveSession.moduleDescriptor)
@@ -462,7 +462,7 @@ internal fun ConstantValue<*>.toKtAnnotationValue(analysisContext: Fe10AnalysisC
psi = null, psi = null,
useSiteTarget = null, useSiteTarget = null,
arguments = value.getKtNamedAnnotationArguments(analysisContext), arguments = value.getKtNamedAnnotationArguments(analysisContext),
index = index, index = null,
) )
) )
} }
@@ -635,7 +635,7 @@ internal val AnnotationDescriptor.useSiteTarget: AnnotationUseSiteTarget?
internal fun AnnotationDescriptor.getKtNamedAnnotationArguments(analysisContext: Fe10AnalysisContext): List<KtNamedAnnotationValue> = internal fun AnnotationDescriptor.getKtNamedAnnotationArguments(analysisContext: Fe10AnalysisContext): List<KtNamedAnnotationValue> =
allValueArguments.map { (name, value) -> allValueArguments.map { (name, value) ->
KtNamedAnnotationValue(name, value.toKtAnnotationValue(analysisContext, index = -1)) KtNamedAnnotationValue(name, value.toKtAnnotationValue(analysisContext))
} }
internal fun CallableDescriptor.createContextReceivers( internal fun CallableDescriptor.createContextReceivers(
@@ -41,7 +41,7 @@ internal fun PrettyPrinter.renderFe10Annotations(
printCollectionIfNotEmpty(valueArguments, separator = ", ", prefix = "(", postfix = ")") { (name, value) -> printCollectionIfNotEmpty(valueArguments, separator = ", ", prefix = "(", postfix = ")") { (name, value) ->
append(name.render()) append(name.render())
append(" = ") append(" = ")
append(value.toKtAnnotationValue(analysisContext, -1).renderAsSourceCode()) append(value.toKtAnnotationValue(analysisContext).renderAsSourceCode())
} }
append(separator) append(separator)
@@ -117,7 +117,7 @@ internal object FirAnnotationValueConverter {
psi as? KtCallElement, psi as? KtCallElement,
useSiteTarget = null, useSiteTarget = null,
toNamedConstantValue(resultMap, session), toNamedConstantValue(resultMap, session),
index = -1, index = null,
) )
) )
} else null } else null
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.psi.KtCallElement
* Some examples: * Some examples:
* - For declarations: `@Deprecated("Should not be used") fun foo(){}` * - For declarations: `@Deprecated("Should not be used") fun foo(){}`
* - For types: `fun foo(x: List<@A Int>){}` * - For types: `fun foo(x: List<@A Int>){}`
* - Inside other annotation (`B` is annotation here): `@A(B()) fun foo(){} * - Inside another annotation (`B` is annotation here): `@A(B()) fun foo(){}
*/ */
public sealed interface KtAnnotationApplication { public sealed interface KtAnnotationApplication {
/** /**
@@ -24,7 +24,7 @@ public sealed interface KtAnnotationApplication {
public val classId: ClassId? public val classId: ClassId?
/** /**
* PsiElement which was used to apply annotation to declaration/type. * [com.intellij.psi.PsiElement] which was used to apply annotation to declaration/type.
* *
* Present only for declarations from sources. For declarations from other places (libraries, stdlib) it's `null` * Present only for declarations from sources. For declarations from other places (libraries, stdlib) it's `null`
*/ */
@@ -33,7 +33,7 @@ public sealed interface KtAnnotationApplication {
/** /**
* [AnnotationUseSiteTarget] to which annotation was applied. May be not-null only for annotation applications for declarations. * [AnnotationUseSiteTarget] to which annotation was applied. May be not-null only for annotation applications for declarations.
* *
* See in more details in [Kotlin Documentation](https://kotlinlang.org/docs/annotations.html#annotation-use-site-targets) for more information about annotation targets. * See more details in [Kotlin Documentation](https://kotlinlang.org/docs/annotations.html#annotation-use-site-targets) for more information about annotation targets.
*/ */
public val useSiteTarget: AnnotationUseSiteTarget? public val useSiteTarget: AnnotationUseSiteTarget?
@@ -43,7 +43,7 @@ public sealed interface KtAnnotationApplication {
public val isCallWithArguments: Boolean public val isCallWithArguments: Boolean
/** /**
* An index of the annotation in an owner. Can be `-1` in case of annotation arguments * An index of the annotation in an owner. `null` for annotation arguments
*/ */
public val index: Int public val index: Int?
} }
@@ -10,39 +10,16 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtCallElement import org.jetbrains.kotlin.psi.KtCallElement
/** /**
* Overview of annotation to some declaration or type. * Info of annotation to some declaration or type.
* *
* Some examples: * Some examples:
* - For declarations: `@Deprecated("Should not be used") fun foo(){}` * - For declarations: `@Deprecated("Should not be used") fun foo(){}`
* - For types: `fun foo(x: List<@A Int>){}` * - For types: `fun foo(x: List<@A Int>){}`
*/ */
public data class KtAnnotationApplicationInfo( public data class KtAnnotationApplicationInfo(
/**
* The [ClassId] of applied annotation. [ClassId] is a fully qualified name on annotation class.
*/
public override val classId: ClassId?, public override val classId: ClassId?,
/**
* [com.intellij.psi.PsiElement] which was used to apply annotation to declaration/type.
*
* Present only for declarations from sources. For declarations from other places (libraries, stdlib) it's `null`
*/
public override val psi: KtCallElement?, public override val psi: KtCallElement?,
/**
* [AnnotationUseSiteTarget] to which annotation was applied. May be not-null only for annotation applications for declarations.
*
* See in more details in [Kotlin Documentation](https://kotlinlang.org/docs/annotations.html#annotation-use-site-targets) for more information about annotation targets.
*/
public override val useSiteTarget: AnnotationUseSiteTarget?, public override val useSiteTarget: AnnotationUseSiteTarget?,
/**
* **true** if the annotation has any arguments
*/
public override val isCallWithArguments: Boolean, public override val isCallWithArguments: Boolean,
/**
* An index of the annotation in an owner
*/
public override val index: Int, public override val index: Int,
) : KtAnnotationApplication ) : KtAnnotationApplication
@@ -18,7 +18,7 @@ public data class KtAnnotationApplicationWithArgumentsInfo(
* A list of annotation arguments which were applied when constructing annotation. Every argument is [KtAnnotationValue] * A list of annotation arguments which were applied when constructing annotation. Every argument is [KtAnnotationValue]
*/ */
public val arguments: List<KtNamedAnnotationValue>, public val arguments: List<KtNamedAnnotationValue>,
override val index: Int, override val index: Int?,
) : KtAnnotationApplication { ) : KtAnnotationApplication {
override val isCallWithArguments: Boolean get() = arguments.isNotEmpty() override val isCallWithArguments: Boolean get() = arguments.isNotEmpty()
} }