diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DefaultAdditionalAnnotationsProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AbstractClassAdditionalAnnotationsProvider.kt similarity index 90% rename from analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DefaultAdditionalAnnotationsProvider.kt rename to analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AbstractClassAdditionalAnnotationsProvider.kt index 0b7b33f4bf3..5ad56971e0c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/DefaultAdditionalAnnotationsProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AbstractClassAdditionalAnnotationsProvider.kt @@ -11,7 +11,6 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiModifierList import org.jetbrains.kotlin.analysis.api.annotations.* import org.jetbrains.kotlin.builtins.StandardNames -import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethod import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.name.CallableId @@ -19,41 +18,29 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds import java.lang.annotation.ElementType -internal object DefaultAdditionalAnnotationsProvider : AdditionalAnnotationsProvider { +internal object AbstractClassAdditionalAnnotationsProvider : AdditionalAnnotationsProvider { override fun addAllAnnotations( currentRawAnnotations: MutableList, foundQualifiers: MutableSet, - owner: PsiModifierList, + owner: PsiModifierList ) { - val parent = owner.parent - if (parent.isAnnotationClass()) { - addAllAnnotationsFromAnnotationClass(currentRawAnnotations, foundQualifiers, owner) - } else if (parent.isMethodWithOverride()) { - addSimpleAnnotationIfMissing(JvmAnnotationNames.OVERRIDE_ANNOTATION.asString(), currentRawAnnotations, foundQualifiers, owner) - } + if (!owner.parent.isAnnotationClass()) return + + addAllAnnotationsFromAnnotationClass(currentRawAnnotations, foundQualifiers, owner) } override fun findAdditionalAnnotation( annotationsBox: LazyAnnotationsBox, qualifiedName: String, - owner: PsiModifierList, - ): PsiAnnotation? { - val parent = owner.parent - return when { - parent.isAnnotationClass() -> findAdditionalAnnotationFromAnnotationClass(annotationsBox, qualifiedName, owner) - parent.isMethodWithOverride() -> { - createSimpleAnnotationIfMatches( - qualifier = qualifiedName, - expectedQualifier = JvmAnnotationNames.OVERRIDE_ANNOTATION.asString(), - owner = owner, - ) - } - - else -> null - } - } + owner: PsiModifierList + ): PsiAnnotation? = if (owner.parent.isAnnotationClass()) + findAdditionalAnnotationFromAnnotationClass(annotationsBox, qualifiedName, owner) + else + null } +private fun PsiElement.isAnnotationClass(): Boolean = this is PsiClass && isAnnotationType + private fun addAllAnnotationsFromAnnotationClass( currentRawAnnotations: MutableList, foundQualifiers: MutableSet, @@ -88,8 +75,6 @@ private fun findAdditionalAnnotationFromAnnotationClass( ?: annotationsBox.tryConvertToDocumentedJavaAnnotation(qualifiedName, owner) ?: annotationsBox.tryConvertToRepeatableJavaAnnotation(qualifiedName, owner) -private fun PsiElement.isAnnotationClass(): Boolean = this is PsiClass && isAnnotationType -private fun PsiElement.isMethodWithOverride(): Boolean = this is SymbolLightMethod<*> && (isDelegated || isOverride()) private fun LazyAnnotationsBox.tryConvertToDocumentedJavaAnnotation( qualifiedName: String, 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 new file mode 100644 index 00000000000..a23d2ffba67 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/MethodAdditionalAnnotationsProvider.kt @@ -0,0 +1,39 @@ +/* + * 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.PsiElement +import com.intellij.psi.PsiModifierList +import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethod +import org.jetbrains.kotlin.load.java.JvmAnnotationNames + +internal object MethodAdditionalAnnotationsProvider : AdditionalAnnotationsProvider { + override fun addAllAnnotations( + currentRawAnnotations: MutableList, + foundQualifiers: MutableSet, + owner: PsiModifierList, + ) { + if (owner.parent.isMethodWithOverride()) { + addSimpleAnnotationIfMissing(JvmAnnotationNames.OVERRIDE_ANNOTATION.asString(), currentRawAnnotations, foundQualifiers, owner) + } + } + + override fun findAdditionalAnnotation( + annotationsBox: LazyAnnotationsBox, + qualifiedName: String, + owner: PsiModifierList, + ): PsiAnnotation? = if (owner.parent.isMethodWithOverride()) + createSimpleAnnotationIfMatches( + qualifier = qualifiedName, + expectedQualifier = JvmAnnotationNames.OVERRIDE_ANNOTATION.asString(), + owner = owner, + ) + else + null +} + +private fun PsiElement.isMethodWithOverride(): Boolean = this is SymbolLightMethod<*> && (isDelegated || isOverride()) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt index 5e53256e094..21c4baa0f8d 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointerOfType import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.KtLightField -import org.jetbrains.kotlin.light.classes.symbol.annotations.DefaultAdditionalAnnotationsProvider +import org.jetbrains.kotlin.light.classes.symbol.annotations.AbstractClassAdditionalAnnotationsProvider import org.jetbrains.kotlin.light.classes.symbol.annotations.LazyAnnotationsBox import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolAnnotationsProvider import org.jetbrains.kotlin.light.classes.symbol.modifierLists.LazyModifiersBox @@ -74,7 +74,7 @@ internal abstract class SymbolLightClassForInterfaceOrAnnotationClass : SymbolLi ), annotationsBox = LazyAnnotationsBox( annotationsProvider = SymbolAnnotationsProvider(ktModule, classOrObjectSymbolPointer), - additionalAnnotationsProvider = DefaultAdditionalAnnotationsProvider, + additionalAnnotationsProvider = AbstractClassAdditionalAnnotationsProvider, ), )