[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)
|
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
|
||||||
|
|||||||
+12
-3
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-4
@@ -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) }
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-3
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-8
@@ -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 {
|
||||||
|
|||||||
+3
-1
@@ -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())
|
||||||
|
|||||||
+8
-2
@@ -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
|
||||||
|
|||||||
+6
-4
@@ -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
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user