[SLC] split DefaultAdditionalAnnotationsProvider into MethodAdditionalAnnotationsProvider and AbstractClassAdditionalAnnotationsProvider

^KT-56046
This commit is contained in:
Dmitrii Gridin
2023-01-25 15:02:49 +01:00
committed by Space Team
parent cb531635b1
commit e081fe92db
3 changed files with 53 additions and 29 deletions
@@ -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<in PsiAnnotation>,
foundQualifiers: MutableSet<String>,
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<in PsiAnnotation>,
foundQualifiers: MutableSet<String>,
@@ -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,
@@ -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<in PsiAnnotation>,
foundQualifiers: MutableSet<String>,
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())
@@ -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,
),
)