[FIR] Add proper nullability for java enums
This commit is contained in:
+3
-3
@@ -11,7 +11,7 @@ public/*package*/ open class A : R|kotlin/Any| {
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final enum class Mixed : R|kotlin/Enum<ft<Mixed, Mixed?>!>| {
|
public final enum class Mixed : R|kotlin/Enum<ft<Mixed, Mixed?>!>| {
|
||||||
public final static field NOT_ENTRY_EITHER: R|ft<Mixed, Mixed?>!|
|
public final static field NOT_ENTRY_EITHER: R|Mixed|
|
||||||
|
|
||||||
public final static fun values(): R|kotlin/Array<Mixed>| {
|
public final static fun values(): R|kotlin/Array<Mixed>| {
|
||||||
}
|
}
|
||||||
@@ -21,9 +21,9 @@ public final enum class Mixed : R|kotlin/Enum<ft<Mixed, Mixed?>!>| {
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final enum class Signs : R|kotlin/Enum<ft<Signs, Signs?>!>| {
|
public final enum class Signs : R|kotlin/Enum<ft<Signs, Signs?>!>| {
|
||||||
public final static field HELLO: R|ft<Signs, Signs?>!|
|
public final static field HELLO: R|Signs|
|
||||||
|
|
||||||
public final static field WORLD: R|ft<Signs, Signs?>!|
|
public final static field WORLD: R|Signs|
|
||||||
|
|
||||||
public final static field X: R|ft<Signs, Signs?>!|
|
public final static field X: R|ft<Signs, Signs?>!|
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary
|
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
|
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.java.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.constructType
|
import org.jetbrains.kotlin.fir.resolve.constructType
|
||||||
@@ -194,6 +195,7 @@ class JavaSymbolProvider(
|
|||||||
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
|
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
|
||||||
isVar = !javaField.isFinal
|
isVar = !javaField.isFinal
|
||||||
isStatic = javaField.isStatic
|
isStatic = javaField.isStatic
|
||||||
|
isEnumEntry = javaField.isEnumEntry
|
||||||
addAnnotationsFrom(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack)
|
addAnnotationsFrom(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack)
|
||||||
}
|
}
|
||||||
declarations += firJavaField
|
declarations += firJavaField
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class FirJavaField @FirImplementationDetail constructor(
|
|||||||
override val isVar: Boolean,
|
override val isVar: Boolean,
|
||||||
override val annotations: MutableList<FirAnnotationCall>,
|
override val annotations: MutableList<FirAnnotationCall>,
|
||||||
override val typeParameters: MutableList<FirTypeParameter>,
|
override val typeParameters: MutableList<FirTypeParameter>,
|
||||||
|
val isEnumEntry: Boolean
|
||||||
) : FirField() {
|
) : FirField() {
|
||||||
init {
|
init {
|
||||||
symbol.bind(this)
|
symbol.bind(this)
|
||||||
@@ -127,6 +128,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
|
|||||||
var modality: Modality? = null
|
var modality: Modality? = null
|
||||||
lateinit var visibility: Visibility
|
lateinit var visibility: Visibility
|
||||||
var isStatic: Boolean by Delegates.notNull()
|
var isStatic: Boolean by Delegates.notNull()
|
||||||
|
var isEnumEntry: Boolean by Delegates.notNull()
|
||||||
|
|
||||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||||
|
|
||||||
@@ -149,7 +151,8 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
|
|||||||
status,
|
status,
|
||||||
isVar,
|
isVar,
|
||||||
annotations,
|
annotations,
|
||||||
typeParameters
|
typeParameters,
|
||||||
|
isEnumEntry
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-3
@@ -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.AnnotationTypeQualifierResolver
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue
|
import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.StringDefaultValue
|
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.*
|
||||||
import org.jetbrains.kotlin.load.java.typeEnhancement.PredefinedFunctionEnhancementInfo
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
|
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.utils.Jsr305State
|
import org.jetbrains.kotlin.utils.Jsr305State
|
||||||
@@ -89,7 +88,18 @@ class JavaClassEnhancementScope(
|
|||||||
is FirField -> {
|
is FirField -> {
|
||||||
if (firElement.returnTypeRef !is FirJavaTypeRef) return original
|
if (firElement.returnTypeRef !is FirJavaTypeRef) return original
|
||||||
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firElement.annotations)
|
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)
|
val symbol = FirFieldSymbol(original.callableId)
|
||||||
buildJavaField {
|
buildJavaField {
|
||||||
@@ -103,6 +113,7 @@ class JavaClassEnhancementScope(
|
|||||||
isVar = firElement.isVar
|
isVar = firElement.isVar
|
||||||
isStatic = firElement.isStatic
|
isStatic = firElement.isStatic
|
||||||
annotations += firElement.annotations
|
annotations += firElement.annotations
|
||||||
|
this.isEnumEntry = isEnumEntry
|
||||||
}
|
}
|
||||||
return symbol
|
return symbol
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -1,10 +1,10 @@
|
|||||||
FILE fqName:<root> fileName:/javaEnum.kt
|
FILE fqName:<root> fileName:/javaEnum.kt
|
||||||
PROPERTY name:test visibility:public modality:FINAL [val]
|
PROPERTY name:test visibility:public modality:FINAL [val]
|
||||||
FIELD PROPERTY_BACKING_FIELD name:test type:<root>.JEnum? visibility:private [final,static]
|
FIELD PROPERTY_BACKING_FIELD name:test type:<root>.JEnum visibility:private [final,static]
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:ONE type:<root>.JEnum? visibility:public [final,static]' type=<root>.JEnum? origin=GET_PROPERTY
|
GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:ONE type:<root>.JEnum visibility:public [final,static]' type=<root>.JEnum origin=GET_PROPERTY
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test> visibility:public modality:FINAL <> () returnType:<root>.JEnum?
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test> visibility:public modality:FINAL <> () returnType:<root>.JEnum
|
||||||
correspondingProperty: PROPERTY name:test visibility:public modality:FINAL [val]
|
correspondingProperty: PROPERTY name:test visibility:public modality:FINAL [val]
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun <get-test> (): <root>.JEnum? declared in <root>'
|
RETURN type=kotlin.Nothing from='public final fun <get-test> (): <root>.JEnum declared in <root>'
|
||||||
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test type:<root>.JEnum? visibility:private [final,static]' type=<root>.JEnum? origin=null
|
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test type:<root>.JEnum visibility:private [final,static]' type=<root>.JEnum origin=null
|
||||||
|
|||||||
+3
-3
@@ -1,9 +1,9 @@
|
|||||||
public final enum class AnnotatedEnumEntry : R|kotlin/Enum<ft<test/AnnotatedEnumEntry, test/AnnotatedEnumEntry?>!>| {
|
public final enum class AnnotatedEnumEntry : R|kotlin/Enum<ft<test/AnnotatedEnumEntry, test/AnnotatedEnumEntry?>!>| {
|
||||||
@R|test/AnnotatedEnumEntry.Anno|(String(a)) public final static field E1: R|ft<test/AnnotatedEnumEntry, test/AnnotatedEnumEntry?>!|
|
@R|test/AnnotatedEnumEntry.Anno|(String(a)) public final static field E1: R|test/AnnotatedEnumEntry|
|
||||||
|
|
||||||
@R|test/AnnotatedEnumEntry.Anno|(String(b)) @R|test/AnnotatedEnumEntry.Anno2|() public final static field E2: R|ft<test/AnnotatedEnumEntry, test/AnnotatedEnumEntry?>!|
|
@R|test/AnnotatedEnumEntry.Anno|(String(b)) @R|test/AnnotatedEnumEntry.Anno2|() public final static field E2: R|test/AnnotatedEnumEntry|
|
||||||
|
|
||||||
public final static field E3: R|ft<test/AnnotatedEnumEntry, test/AnnotatedEnumEntry?>!|
|
public final static field E3: R|test/AnnotatedEnumEntry|
|
||||||
|
|
||||||
public final static fun values(): R|kotlin/Array<test/AnnotatedEnumEntry>| {
|
public final static fun values(): R|kotlin/Array<test/AnnotatedEnumEntry>| {
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
public final enum class EnumConstructorParameter : R|kotlin/Enum<ft<test/EnumConstructorParameter, test/EnumConstructorParameter?>!>| {
|
public final enum class EnumConstructorParameter : R|kotlin/Enum<ft<test/EnumConstructorParameter, test/EnumConstructorParameter?>!>| {
|
||||||
public final static field INSTANCE: R|ft<test/EnumConstructorParameter, test/EnumConstructorParameter?>!|
|
public final static field INSTANCE: R|test/EnumConstructorParameter|
|
||||||
|
|
||||||
private constructor(@R|test/EnumConstructorParameter.Anno|(String(string)) s: R|ft<kotlin/String, kotlin/String?>!|): R|test/EnumConstructorParameter|
|
private constructor(@R|test/EnumConstructorParameter.Anno|(String(string)) s: R|ft<kotlin/String, kotlin/String?>!|): R|test/EnumConstructorParameter|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
public final enum class EnumMembers : R|kotlin/Enum<ft<test/EnumMembers, test/EnumMembers?>!>| {
|
public final enum class EnumMembers : R|kotlin/Enum<ft<test/EnumMembers, test/EnumMembers?>!>| {
|
||||||
public final static field FIRST: R|ft<test/EnumMembers, test/EnumMembers?>!|
|
public final static field FIRST: R|test/EnumMembers|
|
||||||
|
|
||||||
public final static field SECOND: R|ft<test/EnumMembers, test/EnumMembers?>!|
|
public final static field SECOND: R|test/EnumMembers|
|
||||||
|
|
||||||
public final field isFirst: R|kotlin/Boolean|
|
public final field isFirst: R|kotlin/Boolean|
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
public open enum class EnumWithSpecializedEntry : R|kotlin/Enum<ft<test/EnumWithSpecializedEntry, test/EnumWithSpecializedEntry?>!>| {
|
public open enum class EnumWithSpecializedEntry : R|kotlin/Enum<ft<test/EnumWithSpecializedEntry, test/EnumWithSpecializedEntry?>!>| {
|
||||||
public final static field E1: R|ft<test/EnumWithSpecializedEntry, test/EnumWithSpecializedEntry?>!|
|
public final static field E1: R|test/EnumWithSpecializedEntry|
|
||||||
|
|
||||||
public final static field E2: R|ft<test/EnumWithSpecializedEntry, test/EnumWithSpecializedEntry?>!|
|
public final static field E2: R|test/EnumWithSpecializedEntry|
|
||||||
|
|
||||||
public final static fun values(): R|kotlin/Array<test/EnumWithSpecializedEntry>| {
|
public final static fun values(): R|kotlin/Array<test/EnumWithSpecializedEntry>| {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
public final enum class JavaEnum : R|kotlin/Enum<ft<test/JavaEnum, test/JavaEnum?>!>| {
|
public final enum class JavaEnum : R|kotlin/Enum<ft<test/JavaEnum, test/JavaEnum?>!>| {
|
||||||
public final static field ENTRY: R|ft<test/JavaEnum, test/JavaEnum?>!|
|
public final static field ENTRY: R|test/JavaEnum|
|
||||||
|
|
||||||
public final static field ANOTHER: R|ft<test/JavaEnum, test/JavaEnum?>!|
|
public final static field ANOTHER: R|test/JavaEnum|
|
||||||
|
|
||||||
public final static fun values(): R|kotlin/Array<test/JavaEnum>| {
|
public final static fun values(): R|kotlin/Array<test/JavaEnum>| {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
public final enum class Enum : R|kotlin/Enum<ft<test/Enum, test/Enum?>!>| {
|
public final enum class Enum : R|kotlin/Enum<ft<test/Enum, test/Enum?>!>| {
|
||||||
public final static field A: R|ft<test/Enum, test/Enum?>!|
|
public final static field A: R|test/Enum|
|
||||||
|
|
||||||
public final static field B: R|ft<test/Enum, test/Enum?>!|
|
public final static field B: R|test/Enum|
|
||||||
|
|
||||||
public final static field C: R|ft<test/Enum, test/Enum?>!|
|
public final static field C: R|test/Enum|
|
||||||
|
|
||||||
public final static fun values(): R|kotlin/Array<test/Enum>| {
|
public final static fun values(): R|kotlin/Array<test/Enum>| {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
public final enum class StaticMembersInEnum : R|kotlin/Enum<ft<test/StaticMembersInEnum, test/StaticMembersInEnum?>!>| {
|
public final enum class StaticMembersInEnum : R|kotlin/Enum<ft<test/StaticMembersInEnum, test/StaticMembersInEnum?>!>| {
|
||||||
public final static field ENTRY: R|ft<test/StaticMembersInEnum, test/StaticMembersInEnum?>!|
|
public final static field ENTRY: R|test/StaticMembersInEnum|
|
||||||
|
|
||||||
public open static field STATIC_FIELD: R|kotlin/Int|
|
public open static field STATIC_FIELD: R|kotlin/Int|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user