[FIR] Add proper nullability for java enums

This commit is contained in:
Dmitriy Novozhilov
2020-03-20 13:54:12 +03:00
parent 7764492761
commit 7bfe7061e7
12 changed files with 42 additions and 26 deletions
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCall
import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.constructType
@@ -194,6 +195,7 @@ class JavaSymbolProvider(
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
isVar = !javaField.isFinal
isStatic = javaField.isStatic
isEnumEntry = javaField.isEnumEntry
addAnnotationsFrom(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack)
}
declarations += firJavaField
@@ -42,6 +42,7 @@ class FirJavaField @FirImplementationDetail constructor(
override val isVar: Boolean,
override val annotations: MutableList<FirAnnotationCall>,
override val typeParameters: MutableList<FirTypeParameter>,
val isEnumEntry: Boolean
) : FirField() {
init {
symbol.bind(this)
@@ -127,6 +128,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
var modality: Modality? = null
lateinit var visibility: Visibility
var isStatic: Boolean by Delegates.notNull()
var isEnumEntry: Boolean by Delegates.notNull()
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
@@ -149,7 +151,8 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
status,
isVar,
annotations,
typeParameters
typeParameters,
isEnumEntry
)
}
}
@@ -33,8 +33,7 @@ import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver
import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue
import org.jetbrains.kotlin.load.java.descriptors.StringDefaultValue
import org.jetbrains.kotlin.load.java.typeEnhancement.PREDEFINED_FUNCTION_ENHANCEMENT_INFO_BY_SIGNATURE
import org.jetbrains.kotlin.load.java.typeEnhancement.PredefinedFunctionEnhancementInfo
import org.jetbrains.kotlin.load.java.typeEnhancement.*
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.Jsr305State
@@ -89,7 +88,18 @@ class JavaClassEnhancementScope(
is FirField -> {
if (firElement.returnTypeRef !is FirJavaTypeRef) return original
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firElement.annotations)
val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), memberContext, null)
val isEnumEntry = (firElement as? FirJavaField)?.isEnumEntry ?: false
val predefinedInfo = if (isEnumEntry) {
PredefinedFunctionEnhancementInfo(
TypeEnhancementInfo(0 to JavaTypeQualifiers(NullabilityQualifier.NOT_NULL, null, false)),
emptyList()
)
} else {
null
}
val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), memberContext, predefinedInfo)
val symbol = FirFieldSymbol(original.callableId)
buildJavaField {
@@ -103,6 +113,7 @@ class JavaClassEnhancementScope(
isVar = firElement.isVar
isStatic = firElement.isStatic
annotations += firElement.annotations
this.isEnumEntry = isEnumEntry
}
return symbol
}