From 02f6a03ff7796bb0222296a7d8536910fb921f87 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 16 Jun 2020 16:32:25 +0300 Subject: [PATCH] JVM_IR: fix nullability annotations on synthetic marker parameters Synthetic marker parameters (of type Lkotlin/jvm/internal/DefaultConstructorMarker;) don't have annotations (including nullability annotations). Also, for constructor accessors corresponding parameter should be nullable (since we pass 'null' as an argument there). KT-36966 --- .../kotlin/backend/jvm/DeclarationOrigins.kt | 1 + .../kotlin/backend/jvm/codegen/FunctionCodegen.kt | 14 ++++++++++---- .../backend/jvm/lower/SyntheticAccessorLowering.kt | 4 ++-- .../jvmStaticWithDefaultParameters_ir.txt | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt index 3e82f658a7e..8df91834ca7 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt @@ -18,6 +18,7 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin { object LAMBDA_IMPL : IrDeclarationOriginImpl("LAMBDA_IMPL") object FUNCTION_REFERENCE_IMPL : IrDeclarationOriginImpl("FUNCTION_REFERENCE_IMPL", isSynthetic = true) object SYNTHETIC_ACCESSOR : IrDeclarationOriginImpl("SYNTHETIC_ACCESSOR", isSynthetic = true) + object SYNTHETIC_MARKER_PARAMETER : IrDeclarationOriginImpl("SYNTHETIC_MARKER_PARAMETER", isSynthetic = true) object TO_ARRAY : IrDeclarationOriginImpl("TO_ARRAY") object JVM_STATIC_WRAPPER : IrDeclarationOriginImpl("JVM_STATIC_WRAPPER") object JVM_OVERLOADS_WRAPPER : IrDeclarationOriginImpl("JVM_OVERLOADS_WRAPPER") diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index 9d467b5d225..0a1bf9b0d45 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -12,7 +12,10 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.lower.suspendFunctionOriginal import org.jetbrains.kotlin.codegen.AsmUtil -import org.jetbrains.kotlin.codegen.inline.* +import org.jetbrains.kotlin.codegen.inline.MethodBodyVisitor +import org.jetbrains.kotlin.codegen.inline.SMAP +import org.jetbrains.kotlin.codegen.inline.SMAPAndMethodNode +import org.jetbrains.kotlin.codegen.inline.wrapWithMaxLocalCalc import org.jetbrains.kotlin.codegen.mangleNameIfNeeded import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.visitAnnotableParameterCount @@ -23,7 +26,6 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.load.java.JavaVisibilities -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.annotations.JVM_THROWS_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SYNTHETIC_ANNOTATION_FQ_NAME @@ -237,7 +239,7 @@ private fun generateParameterAnnotations( else -> iterator.next() } - if (!kind.isSkippedInGenericSignature) { + if (annotated != null && !kind.isSkippedInGenericSignature && !annotated.isSyntheticMarkerParameter()) { object : AnnotationCodegen(innerClassConsumer, context) { override fun visitAnnotation(descr: String?, visible: Boolean): AnnotationVisitor { return mv.visitParameterAnnotation( @@ -253,11 +255,15 @@ private fun generateParameterAnnotations( path, descr, visible ) } - }.genAnnotations(annotated, parameterSignature.asmType, annotated?.type) + }.genAnnotations(annotated, parameterSignature.asmType, annotated.type) } } } +private fun IrValueParameter.isSyntheticMarkerParameter(): Boolean = + origin == IrDeclarationOrigin.DEFAULT_CONSTRUCTOR_MARKER || + origin == JvmLoweredDeclarationOrigin.SYNTHETIC_MARKER_PARAMETER + private fun generateParameterNames(irFunction: IrFunction, mv: MethodVisitor, jvmSignature: JvmMethodSignature, state: GenerationState) { val iterator = irFunction.valueParameters.iterator() for (parameterSignature in jvmSignature.valueParameters) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index 0f2219d3123..2924fb3ef9e 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -272,8 +272,8 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle accessor.addValueParameter( "constructor_marker".synthesizedString, - context.ir.symbols.defaultConstructorMarker.defaultType, - JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR + context.ir.symbols.defaultConstructorMarker.defaultType.makeNullable(), + JvmLoweredDeclarationOrigin.SYNTHETIC_MARKER_PARAMETER ) accessor.body = IrExpressionBodyImpl( diff --git a/compiler/testData/codegen/bytecodeListing/jvmStaticWithDefaultParameters_ir.txt b/compiler/testData/codegen/bytecodeListing/jvmStaticWithDefaultParameters_ir.txt index efd8a024e0e..451d4203e7f 100644 --- a/compiler/testData/codegen/bytecodeListing/jvmStaticWithDefaultParameters_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/jvmStaticWithDefaultParameters_ir.txt @@ -11,7 +11,7 @@ public final class AnObject { public final class WithCompanion$Companion { inner class WithCompanion$Companion private method (): void - public synthetic method (@org.jetbrains.annotations.NotNull p0: kotlin.jvm.internal.DefaultConstructorMarker): void + public synthetic method (p0: kotlin.jvm.internal.DefaultConstructorMarker): void public synthetic static method foo$default(p0: WithCompanion$Companion, p1: int, p2: int, p3: java.lang.Object): void public final @kotlin.jvm.JvmStatic method foo(p0: int): void }