diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AdditionalAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AdditionalAnnotationsProvider.kt index 199b712966d..4da3857149c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AdditionalAnnotationsProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AdditionalAnnotationsProvider.kt @@ -11,4 +11,17 @@ import com.intellij.psi.PsiModifierList internal interface AdditionalAnnotationsProvider { fun addAllAnnotations(currentRawAnnotations: MutableList, foundQualifiers: MutableSet, owner: PsiModifierList) fun findAdditionalAnnotation(annotationsBox: LazyAnnotationsBox, qualifiedName: String, owner: PsiModifierList): PsiAnnotation? + + fun addSimpleAnnotationIfMissing( + qualifier: String, + currentRawAnnotations: MutableList, + foundQualifiers: MutableSet, + owner: PsiModifierList, + ) { + if (!foundQualifiers.add(qualifier)) return + currentRawAnnotations += SymbolLightSimpleAnnotation(qualifier, owner) + } + + fun createSimpleAnnotationIfMatches(qualifier: String, expectedQualifier: String, owner: PsiModifierList): PsiAnnotation? = + if (qualifier == expectedQualifier) SymbolLightSimpleAnnotation(expectedQualifier, owner) else null } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DefaultAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DefaultAnnotationsProvider.kt index a588961018f..7cc4793ab75 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DefaultAnnotationsProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DefaultAnnotationsProvider.kt @@ -42,8 +42,11 @@ internal object DefaultAnnotationsProvider : AdditionalAnnotationsProvider { return when { parent.isAnnotationClass() -> findAdditionalAnnotationFromAnnotationClass(annotationsBox, qualifiedName, owner) parent.isMethodWithOverride() -> { - val overrideQualifier = JvmAnnotationNames.OVERRIDE_ANNOTATION.asString() - if (qualifiedName == overrideQualifier) SymbolLightSimpleAnnotation(overrideQualifier, owner) else null + createSimpleAnnotationIfMatches( + qualifier = qualifiedName, + expectedQualifier = JvmAnnotationNames.OVERRIDE_ANNOTATION.asString(), + owner = owner, + ) } else -> null @@ -88,16 +91,6 @@ private fun findAdditionalAnnotationFromAnnotationClass( private fun PsiElement.isAnnotationClass(): Boolean = this is PsiClass && isAnnotationType private fun PsiElement.isMethodWithOverride(): Boolean = this is SymbolLightMethod<*> && (isDelegated || isOverride()) -private fun addSimpleAnnotationIfMissing( - qualifier: String, - currentRawAnnotations: MutableList, - foundQualifiers: MutableSet, - owner: PsiModifierList, -) { - if (!foundQualifiers.add(qualifier)) return - currentRawAnnotations += SymbolLightSimpleAnnotation(qualifier, owner) -} - private fun LazyAnnotationsBox.tryConvertToDocumentedJavaAnnotation( qualifiedName: String, owner: PsiModifierList, diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/NullabilityAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/NullabilityAnnotationsProvider.kt new file mode 100644 index 00000000000..97556682dc0 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/NullabilityAnnotationsProvider.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.light.classes.symbol.annotations + +import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiModifierList +import org.jetbrains.kotlin.light.classes.symbol.NullabilityType +import org.jetbrains.kotlin.load.java.JvmAnnotationNames + +internal class NullabilityAnnotationsProvider(private val lazyNullabilityType: Lazy) : AdditionalAnnotationsProvider { + override fun addAllAnnotations( + currentRawAnnotations: MutableList, + foundQualifiers: MutableSet, + owner: PsiModifierList + ) { + val qualifier = lazyNullabilityType.qualifier ?: return + addSimpleAnnotationIfMissing(qualifier, currentRawAnnotations, foundQualifiers, owner) + } + + override fun findAdditionalAnnotation( + annotationsBox: LazyAnnotationsBox, + qualifiedName: String, + owner: PsiModifierList + ): PsiAnnotation? { + if (qualifiedName != JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION.asString() && + qualifiedName != JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION.asString() + ) { + return null + } + + val expectedQualifier = lazyNullabilityType.qualifier ?: return null + return createSimpleAnnotationIfMatches(qualifiedName, expectedQualifier, owner) + } +} + +private val Lazy.qualifier: String? + get() = when (value) { + NullabilityType.NotNull -> JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION + NullabilityType.Nullable -> JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION + else -> null + }?.asString() \ No newline at end of file