JVM IR: Mark lateinit fields as NotNull
This is needed for compatibility with the JVM backend.
This commit is contained in:
committed by
Alexander Udalov
parent
52b29b53bc
commit
3291cf7a6e
+10
-6
@@ -33,19 +33,17 @@ import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
|||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
|
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
|
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
|
|
||||||
import org.jetbrains.kotlin.synthetic.isVisibleOutside
|
import org.jetbrains.kotlin.synthetic.isVisibleOutside
|
||||||
import org.jetbrains.kotlin.types.TypeSystemCommonBackendContext
|
import org.jetbrains.kotlin.types.TypeSystemCommonBackendContext
|
||||||
import org.jetbrains.kotlin.types.isNullabilityFlexible
|
import org.jetbrains.kotlin.types.isNullabilityFlexible
|
||||||
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
||||||
import org.jetbrains.org.objectweb.asm.*
|
import org.jetbrains.org.objectweb.asm.AnnotationVisitor
|
||||||
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
|
import org.jetbrains.org.objectweb.asm.TypePath
|
||||||
import java.lang.annotation.RetentionPolicy
|
import java.lang.annotation.RetentionPolicy
|
||||||
|
|
||||||
abstract class AnnotationCodegen(
|
abstract class AnnotationCodegen(
|
||||||
@@ -139,8 +137,14 @@ abstract class AnnotationCodegen(
|
|||||||
|
|
||||||
val type = when (declaration) {
|
val type = when (declaration) {
|
||||||
is IrFunction -> declaration.returnType
|
is IrFunction -> declaration.returnType
|
||||||
is IrField -> declaration.type
|
|
||||||
is IrValueDeclaration -> declaration.type
|
is IrValueDeclaration -> declaration.type
|
||||||
|
is IrField ->
|
||||||
|
if (declaration.correspondingPropertySymbol?.owner?.isLateinit == true) {
|
||||||
|
// Lateinit fields are nullable, but should be marked as NotNull to match the JVM backend.
|
||||||
|
declaration.type.makeNotNull()
|
||||||
|
} else {
|
||||||
|
declaration.type
|
||||||
|
}
|
||||||
else -> return
|
else -> return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
// Test to ensure that we mark the backing field of a lateinit property
|
||||||
|
// as NotNull, even though the field is nullable in the JVM IR backend.
|
||||||
|
class A {
|
||||||
|
lateinit var x: A
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final class A {
|
||||||
|
public @org.jetbrains.annotations.NotNull field x: A
|
||||||
|
public method <init>(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getX(): A
|
||||||
|
public final method setX(@org.jetbrains.annotations.NotNull p0: A): void
|
||||||
|
}
|
||||||
+5
@@ -74,6 +74,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeListing/jvmStaticWithDefaultParameters.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/jvmStaticWithDefaultParameters.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("lateInitNotNull.kt")
|
||||||
|
public void testLateInitNotNull() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeListing/lateInitNotNull.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noCollectionStubMethodsInInterface.kt")
|
@TestMetadata("noCollectionStubMethodsInInterface.kt")
|
||||||
public void testNoCollectionStubMethodsInInterface() throws Exception {
|
public void testNoCollectionStubMethodsInInterface() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeListing/noCollectionStubMethodsInInterface.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/noCollectionStubMethodsInInterface.kt");
|
||||||
|
|||||||
+5
@@ -74,6 +74,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
|
|||||||
runTest("compiler/testData/codegen/bytecodeListing/jvmStaticWithDefaultParameters.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/jvmStaticWithDefaultParameters.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("lateInitNotNull.kt")
|
||||||
|
public void testLateInitNotNull() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeListing/lateInitNotNull.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noCollectionStubMethodsInInterface.kt")
|
@TestMetadata("noCollectionStubMethodsInInterface.kt")
|
||||||
public void testNoCollectionStubMethodsInInterface() throws Exception {
|
public void testNoCollectionStubMethodsInInterface() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeListing/noCollectionStubMethodsInInterface.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/noCollectionStubMethodsInInterface.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user