[SLC] implement NullabilityAnnotationsProvider

^KT-56046
This commit is contained in:
Dmitrii Gridin
2023-01-24 19:41:04 +01:00
committed by Space Team
parent d76e902b21
commit 465ac23650
3 changed files with 62 additions and 12 deletions
@@ -11,4 +11,17 @@ import com.intellij.psi.PsiModifierList
internal interface AdditionalAnnotationsProvider {
fun addAllAnnotations(currentRawAnnotations: MutableList<in PsiAnnotation>, foundQualifiers: MutableSet<String>, owner: PsiModifierList)
fun findAdditionalAnnotation(annotationsBox: LazyAnnotationsBox, qualifiedName: String, owner: PsiModifierList): PsiAnnotation?
fun addSimpleAnnotationIfMissing(
qualifier: String,
currentRawAnnotations: MutableList<in PsiAnnotation>,
foundQualifiers: MutableSet<String>,
owner: PsiModifierList,
) {
if (!foundQualifiers.add(qualifier)) return
currentRawAnnotations += SymbolLightSimpleAnnotation(qualifier, owner)
}
fun createSimpleAnnotationIfMatches(qualifier: String, expectedQualifier: String, owner: PsiModifierList): PsiAnnotation? =
if (qualifier == expectedQualifier) SymbolLightSimpleAnnotation(expectedQualifier, owner) else null
}
@@ -42,8 +42,11 @@ internal object DefaultAnnotationsProvider : AdditionalAnnotationsProvider {
return when {
parent.isAnnotationClass() -> findAdditionalAnnotationFromAnnotationClass(annotationsBox, qualifiedName, owner)
parent.isMethodWithOverride() -> {
val overrideQualifier = JvmAnnotationNames.OVERRIDE_ANNOTATION.asString()
if (qualifiedName == overrideQualifier) SymbolLightSimpleAnnotation(overrideQualifier, owner) else null
createSimpleAnnotationIfMatches(
qualifier = qualifiedName,
expectedQualifier = JvmAnnotationNames.OVERRIDE_ANNOTATION.asString(),
owner = owner,
)
}
else -> null
@@ -88,16 +91,6 @@ private fun findAdditionalAnnotationFromAnnotationClass(
private fun PsiElement.isAnnotationClass(): Boolean = this is PsiClass && isAnnotationType
private fun PsiElement.isMethodWithOverride(): Boolean = this is SymbolLightMethod<*> && (isDelegated || isOverride())
private fun addSimpleAnnotationIfMissing(
qualifier: String,
currentRawAnnotations: MutableList<in PsiAnnotation>,
foundQualifiers: MutableSet<String>,
owner: PsiModifierList,
) {
if (!foundQualifiers.add(qualifier)) return
currentRawAnnotations += SymbolLightSimpleAnnotation(qualifier, owner)
}
private fun LazyAnnotationsBox.tryConvertToDocumentedJavaAnnotation(
qualifiedName: String,
owner: PsiModifierList,
@@ -0,0 +1,44 @@
/*
* 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.PsiModifierList
import org.jetbrains.kotlin.light.classes.symbol.NullabilityType
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
internal class NullabilityAnnotationsProvider(private val lazyNullabilityType: Lazy<NullabilityType>) : AdditionalAnnotationsProvider {
override fun addAllAnnotations(
currentRawAnnotations: MutableList<in PsiAnnotation>,
foundQualifiers: MutableSet<String>,
owner: PsiModifierList
) {
val qualifier = lazyNullabilityType.qualifier ?: return
addSimpleAnnotationIfMissing(qualifier, currentRawAnnotations, foundQualifiers, owner)
}
override fun findAdditionalAnnotation(
annotationsBox: LazyAnnotationsBox,
qualifiedName: String,
owner: PsiModifierList
): PsiAnnotation? {
if (qualifiedName != JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION.asString() &&
qualifiedName != JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION.asString()
) {
return null
}
val expectedQualifier = lazyNullabilityType.qualifier ?: return null
return createSimpleAnnotationIfMatches(qualifiedName, expectedQualifier, owner)
}
}
private val Lazy<NullabilityType>.qualifier: String?
get() = when (value) {
NullabilityType.NotNull -> JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION
NullabilityType.Nullable -> JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION
else -> null
}?.asString()