[AA LC] Properly compute retention for @java.lang.annotation.Retention

This commit is contained in:
Dmitriy Novozhilov
2022-08-10 16:49:16 +03:00
parent 77546e5e06
commit 7e24ddeb40
3 changed files with 10 additions and 5 deletions
@@ -146,7 +146,12 @@ internal fun KtAnnotatedSymbol.computeAnnotations(
if (parentIsAnnotation && if (parentIsAnnotation &&
annotations.none { it.classId?.asFqNameString() == JAVA_LANG_ANNOTATION_RETENTION } annotations.none { it.classId?.asFqNameString() == JAVA_LANG_ANNOTATION_RETENTION }
) { ) {
result.add(createRetentionRuntimeAnnotation(parent)) val argumentWithKotlinRetention = annotations.firstOrNull { it.classId == StandardClassIds.Annotations.Retention }
?.arguments
?.firstOrNull { it.name.asString() == "value" }
?.expression
val kotlinRetentionName = (argumentWithKotlinRetention as? KtEnumEntryAnnotationValue)?.callableId?.callableName?.asString()
result.add(createRetentionRuntimeAnnotation(parent, kotlinRetentionName))
} }
if (nullabilityAnnotation != null) { if (nullabilityAnnotation != null) {
@@ -156,7 +161,7 @@ internal fun KtAnnotatedSymbol.computeAnnotations(
return result return result
} }
private fun createRetentionRuntimeAnnotation(parent: PsiElement): PsiAnnotation = private fun createRetentionRuntimeAnnotation(parent: PsiElement, retentionName: String? = null): PsiAnnotation =
SymbolLightSimpleAnnotation( SymbolLightSimpleAnnotation(
JAVA_LANG_ANNOTATION_RETENTION, JAVA_LANG_ANNOTATION_RETENTION,
parent, parent,
@@ -166,7 +171,7 @@ private fun createRetentionRuntimeAnnotation(parent: PsiElement): PsiAnnotation
expression = KtEnumEntryAnnotationValue( expression = KtEnumEntryAnnotationValue(
callableId = CallableId( callableId = CallableId(
ClassId.fromString(RETENTION_POLICY_ENUM.asString()), ClassId.fromString(RETENTION_POLICY_ENUM.asString()),
Name.identifier(AnnotationRetention.RUNTIME.name) Name.identifier(retentionName ?: AnnotationRetention.RUNTIME.name)
), ),
sourcePsi = null sourcePsi = null
) )
@@ -1,4 +1,4 @@
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.SOURCE)
@kotlin.annotation.MustBeDocumented() @kotlin.annotation.MustBeDocumented()
@kotlin.annotation.Repeatable() @kotlin.annotation.Repeatable()
@kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE)
@@ -49,7 +49,7 @@ public abstract @interface Anno /* Anno*/ {
} }
@Deprecated(message = "This anno is deprecated, use === instead", replaceWith = @ReplaceWith(expression = "this === other")) @Deprecated(message = "This anno is deprecated, use === instead", replaceWith = @ReplaceWith(expression = "this === other"))
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.SOURCE)
@kotlin.annotation.MustBeDocumented() @kotlin.annotation.MustBeDocumented()
@kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE)
@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.EXPRESSION}) @kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.EXPRESSION})