[JVM IR] Do not add nullability annotation for functions that return

platform types.

This behavior matches the non-IR backend, which was added in
f16dcdd8a9.
This commit is contained in:
Mark Punzalan
2020-02-05 14:48:58 -08:00
committed by Dmitry Petrov
parent 0c984c5e62
commit 06b6477d04
4 changed files with 28 additions and 4 deletions
@@ -32,10 +32,8 @@ import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrNull
import org.jetbrains.kotlin.ir.types.isMarkedNullable
import org.jetbrains.kotlin.ir.types.isNullable
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
@@ -45,6 +43,7 @@ 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.types.TypeSystemCommonBackendContext
import org.jetbrains.kotlin.types.isNullabilityFlexible
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
import org.jetbrains.org.objectweb.asm.*
import java.lang.annotation.RetentionPolicy
@@ -153,6 +152,11 @@ abstract class AnnotationCodegen(
return
}
// A flexible type whose lower bound in not-null and upper bound is nullable, should not be annotated
if (type.toKotlinType().isNullabilityFlexible()) {
return
}
val annotationClass = if (type.isNullable()) Nullable::class.java else NotNull::class.java
generateAnnotationIfNotPresent(annotationDescriptorsAlreadyPresent, annotationClass)
@@ -0,0 +1,8 @@
// WITH_RUNTIME
import java.util.Collections
class PlatformTypes {
fun simplyPlatform() = Collections.singletonList("")[0]
fun bothNullable() = Collections.emptyList<String>() ?: null
fun bothNotNull() = Collections.emptyList<String>()!!
}
@@ -0,0 +1,7 @@
@kotlin.Metadata
public final class PlatformTypes {
public method <init>(): void
public final @org.jetbrains.annotations.NotNull method bothNotNull(): java.util.List
public final @org.jetbrains.annotations.Nullable method bothNullable(): java.util.List
public final method simplyPlatform(): java.lang.String
}
@@ -94,6 +94,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
runTest("compiler/testData/codegen/bytecodeListing/noToArrayInJava.kt");
}
@TestMetadata("platformTypes.kt")
public void testPlatformTypes() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/platformTypes.kt");
}
@TestMetadata("privateDefaultSetter.kt")
public void testPrivateDefaultSetter() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/privateDefaultSetter.kt");