[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
This commit is contained in:
Dmitrii Gridin
2023-01-30 19:54:31 +01:00
committed by Space Team
parent ba9520f5c5
commit d7dcb5c56a
8 changed files with 51 additions and 27 deletions
@@ -29,14 +29,16 @@ internal object AbstractClassAdditionalAnnotationsProvider : AdditionalAnnotatio
addAllAnnotationsFromAnnotationClass(currentRawAnnotations, foundQualifiers, owner) addAllAnnotationsFromAnnotationClass(currentRawAnnotations, foundQualifiers, owner)
} }
override fun findAdditionalAnnotation( override fun findSpecialAnnotation(
annotationsBox: LazyAnnotationsBox, annotationsBox: LazyAnnotationsBox,
qualifiedName: String, qualifiedName: String,
owner: PsiModifierList owner: PsiModifierList,
): PsiAnnotation? = if (owner.parent.isAnnotationClass()) ): PsiAnnotation? = if (owner.parent.isAnnotationClass())
findAdditionalAnnotationFromAnnotationClass(annotationsBox, qualifiedName, owner) findAdditionalAnnotationFromAnnotationClass(annotationsBox, qualifiedName, owner)
else else
null null
override fun isSpecialQualifier(qualifiedName: String): Boolean = false
} }
private fun PsiElement.isAnnotationClass(): Boolean = this is PsiClass && isAnnotationType private fun PsiElement.isAnnotationClass(): Boolean = this is PsiClass && isAnnotationType
@@ -10,7 +10,13 @@ import com.intellij.psi.PsiModifierList
internal sealed interface AdditionalAnnotationsProvider { internal sealed interface AdditionalAnnotationsProvider {
fun addAllAnnotations(currentRawAnnotations: MutableList<in PsiAnnotation>, foundQualifiers: MutableSet<String>, owner: PsiModifierList) fun addAllAnnotations(currentRawAnnotations: MutableList<in PsiAnnotation>, foundQualifiers: MutableSet<String>, 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( fun addSimpleAnnotationIfMissing(
qualifier: String, qualifier: String,
@@ -22,6 +28,9 @@ internal sealed interface AdditionalAnnotationsProvider {
currentRawAnnotations += SymbolLightSimpleAnnotation(qualifier, owner) currentRawAnnotations += SymbolLightSimpleAnnotation(qualifier, owner)
} }
fun createSimpleAnnotationIfMatches(qualifier: String, expectedQualifier: String, owner: PsiModifierList): PsiAnnotation? = fun createSimpleAnnotationIfMatches(
if (qualifier == expectedQualifier) SymbolLightSimpleAnnotation(expectedQualifier, owner) else null qualifier: String,
expectedQualifier: String,
owner: PsiModifierList,
): PsiAnnotation? = if (qualifier == expectedQualifier) SymbolLightSimpleAnnotation(expectedQualifier, owner) else null
} }
@@ -16,14 +16,16 @@ internal class CompositeAdditionalAnnotationsProvider(val providers: List<Additi
foundQualifiers: MutableSet<String>, foundQualifiers: MutableSet<String>,
owner: PsiModifierList, owner: PsiModifierList,
) { ) {
for (provider in providers) { providers.forEach { provider ->
provider.addAllAnnotations(currentRawAnnotations, foundQualifiers, owner) provider.addAllAnnotations(currentRawAnnotations, foundQualifiers, owner)
} }
} }
override fun findAdditionalAnnotation( override fun findSpecialAnnotation(
annotationsBox: LazyAnnotationsBox, annotationsBox: LazyAnnotationsBox,
qualifiedName: String, qualifiedName: String,
owner: PsiModifierList owner: PsiModifierList,
): PsiAnnotation? = providers.firstNotNullOfOrNull { it.findAdditionalAnnotation(annotationsBox, qualifiedName, owner) } ): PsiAnnotation? = providers.firstNotNullOfOrNull { provider -> provider.findSpecialAnnotation(annotationsBox, qualifiedName, owner) }
override fun isSpecialQualifier(qualifiedName: String): Boolean = providers.any { it.isSpecialQualifier(qualifiedName) }
} }
@@ -12,12 +12,14 @@ internal object EmptyAdditionalAnnotationsProvider : AdditionalAnnotationsProvid
override fun addAllAnnotations( override fun addAllAnnotations(
currentRawAnnotations: MutableList<in PsiAnnotation>, currentRawAnnotations: MutableList<in PsiAnnotation>,
foundQualifiers: MutableSet<String>, foundQualifiers: MutableSet<String>,
owner: PsiModifierList owner: PsiModifierList,
) = Unit ) = Unit
override fun findAdditionalAnnotation( override fun findSpecialAnnotation(
annotationsBox: LazyAnnotationsBox, annotationsBox: LazyAnnotationsBox,
qualifiedName: String, qualifiedName: String,
owner: PsiModifierList owner: PsiModifierList,
): PsiAnnotation? = null ): PsiAnnotation? = null
override fun isSpecialQualifier(qualifiedName: String): Boolean = false
} }
@@ -54,17 +54,16 @@ internal class LazyAnnotationsBox(
return annotations.find { it.qualifiedName == qualifiedName } return annotations.find { it.qualifiedName == qualifiedName }
} }
val specialAnnotationClassId = specialAnnotationsList[qualifiedName] specialAnnotationsList[qualifiedName]?.let { specialAnnotationClassId ->
val specialAnnotation = if (specialAnnotationClassId != null) {
val annotationApplication = annotationsProvider[specialAnnotationClassId].firstOrNull() ?: return null val annotationApplication = annotationsProvider[specialAnnotationClassId].firstOrNull() ?: return null
SymbolLightLazyAnnotation(annotationsProvider, annotationApplication, owner) return SymbolLightLazyAnnotation(annotationsProvider, annotationApplication, owner)
} else if (withAdditionalAnnotations) {
additionalAnnotationsProvider.findAdditionalAnnotation(this, qualifiedName, owner)
} else {
null
} }
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 { override fun hasAnnotation(owner: PsiModifierList, qualifiedName: String): Boolean {
@@ -22,7 +22,7 @@ internal object MethodAdditionalAnnotationsProvider : AdditionalAnnotationsProvi
} }
} }
override fun findAdditionalAnnotation( override fun findSpecialAnnotation(
annotationsBox: LazyAnnotationsBox, annotationsBox: LazyAnnotationsBox,
qualifiedName: String, qualifiedName: String,
owner: PsiModifierList, owner: PsiModifierList,
@@ -34,6 +34,8 @@ internal object MethodAdditionalAnnotationsProvider : AdditionalAnnotationsProvi
) )
else else
null null
override fun isSpecialQualifier(qualifiedName: String): Boolean = false
} }
private fun PsiElement.isMethodWithOverride(): Boolean = this is SymbolLightMethod<*> && (isDelegated || isOverride()) private fun PsiElement.isMethodWithOverride(): Boolean = this is SymbolLightMethod<*> && (isDelegated || isOverride())
@@ -23,10 +23,10 @@ internal class NullabilityAnnotationsProvider(private val lazyNullabilityType: L
addSimpleAnnotationIfMissing(qualifier, currentRawAnnotations, foundQualifiers, owner) addSimpleAnnotationIfMissing(qualifier, currentRawAnnotations, foundQualifiers, owner)
} }
override fun findAdditionalAnnotation( override fun findSpecialAnnotation(
annotationsBox: LazyAnnotationsBox, annotationsBox: LazyAnnotationsBox,
qualifiedName: String, qualifiedName: String,
owner: PsiModifierList owner: PsiModifierList,
): PsiAnnotation? { ): PsiAnnotation? {
if (qualifiedName != JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION.asString() && if (qualifiedName != JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION.asString() &&
qualifiedName != JvmAnnotationNames.JETBRAINS_NULLABLE_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 val expectedQualifier = lazyNullabilityType.qualifier ?: return null
return createSimpleAnnotationIfMatches(qualifiedName, expectedQualifier, owner) 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<NullabilityType>.qualifier: String? private val Lazy<NullabilityType>.qualifier: String?
get() = when (value) { get() = when (value) {
NullabilityType.NotNull -> JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION NullabilityType.NotNull -> JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION
@@ -16,20 +16,22 @@ internal class SimpleAdditionalAnnotationsProvider(
override fun addAllAnnotations( override fun addAllAnnotations(
currentRawAnnotations: MutableList<in PsiAnnotation>, currentRawAnnotations: MutableList<in PsiAnnotation>,
foundQualifiers: MutableSet<String>, foundQualifiers: MutableSet<String>,
owner: PsiModifierList owner: PsiModifierList,
) { ) {
for (qualifiedName in additionalAnnotationQualifiers) { additionalAnnotationQualifiers.forEach { qualifiedName ->
addSimpleAnnotationIfMissing(qualifiedName, currentRawAnnotations, foundQualifiers, owner) addSimpleAnnotationIfMissing(qualifiedName, currentRawAnnotations, foundQualifiers, owner)
} }
} }
override fun findAdditionalAnnotation( override fun findSpecialAnnotation(
annotationsBox: LazyAnnotationsBox, annotationsBox: LazyAnnotationsBox,
qualifiedName: String, qualifiedName: String,
owner: PsiModifierList owner: PsiModifierList,
): PsiAnnotation? { ): PsiAnnotation? {
if (qualifiedName !in additionalAnnotationQualifiers) return null if (qualifiedName !in additionalAnnotationQualifiers) return null
return createSimpleAnnotationIfMatches(qualifiedName, qualifiedName, owner) return createSimpleAnnotationIfMatches(qualifiedName, qualifiedName, owner)
} }
override fun isSpecialQualifier(qualifiedName: String): Boolean = false
} }