[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:
committed by
Space Team
parent
ba9520f5c5
commit
d7dcb5c56a
+4
-2
@@ -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
|
||||
|
||||
+12
-3
@@ -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
|
||||
}
|
||||
|
||||
+6
-4
@@ -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) }
|
||||
}
|
||||
|
||||
+5
-3
@@ -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
|
||||
}
|
||||
|
||||
+7
-8
@@ -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 {
|
||||
|
||||
+3
-1
@@ -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())
|
||||
|
||||
+8
-2
@@ -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
|
||||
|
||||
+6
-4
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user