[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)
}
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
@@ -10,7 +10,13 @@ import com.intellij.psi.PsiModifierList
internal sealed interface AdditionalAnnotationsProvider {
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(
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
}
@@ -16,14 +16,16 @@ internal class CompositeAdditionalAnnotationsProvider(val providers: List<Additi
foundQualifiers: MutableSet<String>,
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) }
}
@@ -12,12 +12,14 @@ internal object EmptyAdditionalAnnotationsProvider : AdditionalAnnotationsProvid
override fun addAllAnnotations(
currentRawAnnotations: MutableList<in PsiAnnotation>,
foundQualifiers: MutableSet<String>,
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
}
@@ -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 {
@@ -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())
@@ -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<NullabilityType>.qualifier: String?
get() = when (value) {
NullabilityType.NotNull -> JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION
@@ -16,20 +16,22 @@ internal class SimpleAdditionalAnnotationsProvider(
override fun addAllAnnotations(
currentRawAnnotations: MutableList<in PsiAnnotation>,
foundQualifiers: MutableSet<String>,
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
}