JVM: Generate object and companion object INSTANCE fields as @NotNull

This commit is contained in:
Dmitry Petrov
2020-06-17 15:30:18 +03:00
parent 558dfc6d9a
commit e9231b5624
41 changed files with 84 additions and 44 deletions
@@ -10,18 +10,19 @@ import com.intellij.psi.*
import com.intellij.psi.impl.light.LightFieldBuilder
import com.intellij.psi.util.TypeConversionUtil
import org.jetbrains.annotations.NonNls
import org.jetbrains.annotations.NotNull
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.elements.*
import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightFieldForSourceDeclarationSupport
import org.jetbrains.kotlin.asJava.elements.KtUltraLightSimpleModifierList
import org.jetbrains.kotlin.codegen.PropertyCodegen
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.VAL_KEYWORD
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
@@ -76,7 +77,8 @@ internal open class KtUltraLightFieldImpl protected constructor(
KtUltraLightSimpleModifierListField(support, declaration, this, modifiers)
}
override fun isEquivalentTo(another: PsiElement?): Boolean = kotlinOrigin == another || (another as? KtLightField)?.kotlinOrigin == kotlinOrigin
override fun isEquivalentTo(another: PsiElement?): Boolean =
kotlinOrigin == another || (another as? KtLightField)?.kotlinOrigin == kotlinOrigin
override fun getModifierList(): PsiModifierList = modifierList
@@ -105,11 +107,12 @@ internal open class KtUltraLightFieldImpl protected constructor(
}
override val qualifiedNameForNullabilityAnnotation: String?
get() {
// We don't generate nullability annotations for non-backing fields in backend
val typeForAnnotation = kotlinType?.takeUnless { declaration is KtEnumEntry || declaration is KtObjectDeclaration }
return computeQualifiedNameForNullabilityAnnotation(typeForAnnotation)
}
get() =
when (declaration) {
is KtObjectDeclaration -> NotNull::class.java.name
is KtEnumEntry -> null
else -> computeQualifiedNameForNullabilityAnnotation(kotlinType)
}
override val psiTypeForNullabilityAnnotation: PsiType?
get() = type
@@ -309,6 +309,9 @@ open class KtLightNullabilityAnnotation<D : KtLightElement<*, PsiModifierListOwn
// all data-class generated members are not-null
if (annotatedElement is KtClass && annotatedElement.isData()) return NotNull::class.java.name
// objects and companion objects are not null
if (annotatedElement is KtObjectDeclaration) return NotNull::class.java.name
if (annotatedElement is KtParameter) {
if (annotatedElement.containingClassOrObject?.isAnnotation() == true) return null
}