From d7dcb5c56ad03f2ce7cf085ca83ed8eb85cb6598 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Mon, 30 Jan 2023 19:54:31 +0100 Subject: [PATCH] [SLC] AdditionalAnnotationsProvider: do not process findAnnotation separately Currently, we don't have enough support in the compiler to process new special annotations (KT-56299), so let's avoid them now ^KT-56046 --- .../AbstractClassAdditionalAnnotationsProvider.kt | 6 ++++-- .../annotations/AdditionalAnnotationsProvider.kt | 15 ++++++++++++--- .../CompositeAdditionalAnnotationsProvider.kt | 10 ++++++---- .../EmptyAdditionalAnnotationsProvider.kt | 8 +++++--- .../symbol/annotations/LazyAnnotationsBox.kt | 15 +++++++-------- .../MethodAdditionalAnnotationsProvider.kt | 4 +++- .../annotations/NullabilityAnnotationsProvider.kt | 10 ++++++++-- .../SimpleAdditionalAnnotationsProvider.kt | 10 ++++++---- 8 files changed, 51 insertions(+), 27 deletions(-) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AbstractClassAdditionalAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AbstractClassAdditionalAnnotationsProvider.kt index bad0a87c8ec..4087eb5bcda 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AbstractClassAdditionalAnnotationsProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AbstractClassAdditionalAnnotationsProvider.kt @@ -29,14 +29,16 @@ internal object AbstractClassAdditionalAnnotationsProvider : AdditionalAnnotatio addAllAnnotationsFromAnnotationClass(currentRawAnnotations, foundQualifiers, owner) } - override fun findAdditionalAnnotation( + override fun findSpecialAnnotation( annotationsBox: LazyAnnotationsBox, qualifiedName: String, - owner: PsiModifierList + owner: PsiModifierList, ): PsiAnnotation? = if (owner.parent.isAnnotationClass()) findAdditionalAnnotationFromAnnotationClass(annotationsBox, qualifiedName, owner) else null + + override fun isSpecialQualifier(qualifiedName: String): Boolean = false } private fun PsiElement.isAnnotationClass(): Boolean = this is PsiClass && isAnnotationType 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 d1def0aad27..82a368c287f 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 @@ -10,7 +10,13 @@ import com.intellij.psi.PsiModifierList internal sealed interface AdditionalAnnotationsProvider { fun addAllAnnotations(currentRawAnnotations: MutableList, foundQualifiers: MutableSet, owner: PsiModifierList) - fun findAdditionalAnnotation(annotationsBox: LazyAnnotationsBox, qualifiedName: String, owner: PsiModifierList): PsiAnnotation? + + /** + * @return **true** if this qualifier should be treated as a **special** in [LazyAnnotationsBox.findAnnotation] + * (should be processed without [LazyAnnotationsBox.getOrComputeCachedAnnotations] call) + */ + fun isSpecialQualifier(qualifiedName: String): Boolean + fun findSpecialAnnotation(annotationsBox: LazyAnnotationsBox, qualifiedName: String, owner: PsiModifierList): PsiAnnotation? fun addSimpleAnnotationIfMissing( qualifier: String, @@ -22,6 +28,9 @@ internal sealed interface AdditionalAnnotationsProvider { currentRawAnnotations += SymbolLightSimpleAnnotation(qualifier, owner) } - fun createSimpleAnnotationIfMatches(qualifier: String, expectedQualifier: String, owner: PsiModifierList): PsiAnnotation? = - if (qualifier == expectedQualifier) SymbolLightSimpleAnnotation(expectedQualifier, owner) else null + 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/CompositeAdditionalAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/CompositeAdditionalAnnotationsProvider.kt index be07e0dca82..4197ddee56c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/CompositeAdditionalAnnotationsProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/CompositeAdditionalAnnotationsProvider.kt @@ -16,14 +16,16 @@ internal class CompositeAdditionalAnnotationsProvider(val providers: List, owner: PsiModifierList, ) { - for (provider in providers) { + providers.forEach { provider -> provider.addAllAnnotations(currentRawAnnotations, foundQualifiers, owner) } } - override fun findAdditionalAnnotation( + override fun findSpecialAnnotation( annotationsBox: LazyAnnotationsBox, qualifiedName: String, - owner: PsiModifierList - ): PsiAnnotation? = providers.firstNotNullOfOrNull { it.findAdditionalAnnotation(annotationsBox, qualifiedName, owner) } + owner: PsiModifierList, + ): PsiAnnotation? = providers.firstNotNullOfOrNull { provider -> provider.findSpecialAnnotation(annotationsBox, qualifiedName, owner) } + + override fun isSpecialQualifier(qualifiedName: String): Boolean = providers.any { it.isSpecialQualifier(qualifiedName) } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/EmptyAdditionalAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/EmptyAdditionalAnnotationsProvider.kt index e87992ed08b..a781dc6ffb7 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/EmptyAdditionalAnnotationsProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/EmptyAdditionalAnnotationsProvider.kt @@ -12,12 +12,14 @@ internal object EmptyAdditionalAnnotationsProvider : AdditionalAnnotationsProvid override fun addAllAnnotations( currentRawAnnotations: MutableList, foundQualifiers: MutableSet, - owner: PsiModifierList + owner: PsiModifierList, ) = Unit - override fun findAdditionalAnnotation( + override fun findSpecialAnnotation( annotationsBox: LazyAnnotationsBox, qualifiedName: String, - owner: PsiModifierList + owner: PsiModifierList, ): PsiAnnotation? = null + + override fun isSpecialQualifier(qualifiedName: String): Boolean = false } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/LazyAnnotationsBox.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/LazyAnnotationsBox.kt index 5626612d4b5..c34a96e8eeb 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/LazyAnnotationsBox.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/LazyAnnotationsBox.kt @@ -54,17 +54,16 @@ internal class LazyAnnotationsBox( return annotations.find { it.qualifiedName == qualifiedName } } - val specialAnnotationClassId = specialAnnotationsList[qualifiedName] - val specialAnnotation = if (specialAnnotationClassId != null) { + specialAnnotationsList[qualifiedName]?.let { specialAnnotationClassId -> val annotationApplication = annotationsProvider[specialAnnotationClassId].firstOrNull() ?: return null - SymbolLightLazyAnnotation(annotationsProvider, annotationApplication, owner) - } else if (withAdditionalAnnotations) { - additionalAnnotationsProvider.findAdditionalAnnotation(this, qualifiedName, owner) - } else { - null + return SymbolLightLazyAnnotation(annotationsProvider, annotationApplication, owner) } - return specialAnnotation ?: getOrComputeCachedAnnotations(owner).find { it.qualifiedName == qualifiedName } + if (withAdditionalAnnotations && additionalAnnotationsProvider.isSpecialQualifier(qualifiedName)) { + return additionalAnnotationsProvider.findSpecialAnnotation(this, qualifiedName, owner) + } + + return getOrComputeCachedAnnotations(owner).find { it.qualifiedName == qualifiedName } } override fun hasAnnotation(owner: PsiModifierList, qualifiedName: String): Boolean { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/MethodAdditionalAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/MethodAdditionalAnnotationsProvider.kt index a23d2ffba67..3ba5f602c1f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/MethodAdditionalAnnotationsProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/MethodAdditionalAnnotationsProvider.kt @@ -22,7 +22,7 @@ internal object MethodAdditionalAnnotationsProvider : AdditionalAnnotationsProvi } } - override fun findAdditionalAnnotation( + override fun findSpecialAnnotation( annotationsBox: LazyAnnotationsBox, qualifiedName: String, owner: PsiModifierList, @@ -34,6 +34,8 @@ internal object MethodAdditionalAnnotationsProvider : AdditionalAnnotationsProvi ) else null + + override fun isSpecialQualifier(qualifiedName: String): Boolean = false } private fun PsiElement.isMethodWithOverride(): Boolean = this is SymbolLightMethod<*> && (isDelegated || isOverride()) 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 index c269880df8d..7dfa18f7a19 100644 --- 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 @@ -23,10 +23,10 @@ internal class NullabilityAnnotationsProvider(private val lazyNullabilityType: L addSimpleAnnotationIfMissing(qualifier, currentRawAnnotations, foundQualifiers, owner) } - override fun findAdditionalAnnotation( + override fun findSpecialAnnotation( annotationsBox: LazyAnnotationsBox, qualifiedName: String, - owner: PsiModifierList + owner: PsiModifierList, ): PsiAnnotation? { if (qualifiedName != JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION.asString() && qualifiedName != JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION.asString() @@ -37,8 +37,14 @@ internal class NullabilityAnnotationsProvider(private val lazyNullabilityType: L val expectedQualifier = lazyNullabilityType.qualifier ?: return null return createSimpleAnnotationIfMatches(qualifiedName, expectedQualifier, owner) } + + override fun isSpecialQualifier(qualifiedName: String): Boolean = false } +private val String.isNullOrNotNullQualifiedName: Boolean + get() = this == JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION.asString() || + this == JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION.asString() + private val Lazy.qualifier: String? get() = when (value) { NullabilityType.NotNull -> JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SimpleAdditionalAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SimpleAdditionalAnnotationsProvider.kt index 1bd24966af2..e67b9d548f5 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SimpleAdditionalAnnotationsProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SimpleAdditionalAnnotationsProvider.kt @@ -16,20 +16,22 @@ internal class SimpleAdditionalAnnotationsProvider( override fun addAllAnnotations( currentRawAnnotations: MutableList, foundQualifiers: MutableSet, - owner: PsiModifierList + owner: PsiModifierList, ) { - for (qualifiedName in additionalAnnotationQualifiers) { + additionalAnnotationQualifiers.forEach { qualifiedName -> addSimpleAnnotationIfMissing(qualifiedName, currentRawAnnotations, foundQualifiers, owner) } } - override fun findAdditionalAnnotation( + override fun findSpecialAnnotation( annotationsBox: LazyAnnotationsBox, qualifiedName: String, - owner: PsiModifierList + owner: PsiModifierList, ): PsiAnnotation? { if (qualifiedName !in additionalAnnotationQualifiers) return null return createSimpleAnnotationIfMatches(qualifiedName, qualifiedName, owner) } + + override fun isSpecialQualifier(qualifiedName: String): Boolean = false } \ No newline at end of file