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
This commit is contained in:
@@ -18,6 +18,7 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin {
|
|||||||
object LAMBDA_IMPL : IrDeclarationOriginImpl("LAMBDA_IMPL")
|
object LAMBDA_IMPL : IrDeclarationOriginImpl("LAMBDA_IMPL")
|
||||||
object FUNCTION_REFERENCE_IMPL : IrDeclarationOriginImpl("FUNCTION_REFERENCE_IMPL", isSynthetic = true)
|
object FUNCTION_REFERENCE_IMPL : IrDeclarationOriginImpl("FUNCTION_REFERENCE_IMPL", isSynthetic = true)
|
||||||
object SYNTHETIC_ACCESSOR : IrDeclarationOriginImpl("SYNTHETIC_ACCESSOR", 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 TO_ARRAY : IrDeclarationOriginImpl("TO_ARRAY")
|
||||||
object JVM_STATIC_WRAPPER : IrDeclarationOriginImpl("JVM_STATIC_WRAPPER")
|
object JVM_STATIC_WRAPPER : IrDeclarationOriginImpl("JVM_STATIC_WRAPPER")
|
||||||
object JVM_OVERLOADS_WRAPPER : IrDeclarationOriginImpl("JVM_OVERLOADS_WRAPPER")
|
object JVM_OVERLOADS_WRAPPER : IrDeclarationOriginImpl("JVM_OVERLOADS_WRAPPER")
|
||||||
|
|||||||
+10
-4
@@ -12,7 +12,10 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
|||||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.backend.jvm.lower.suspendFunctionOriginal
|
import org.jetbrains.kotlin.backend.jvm.lower.suspendFunctionOriginal
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
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.mangleNameIfNeeded
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.codegen.visitAnnotableParameterCount
|
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.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.load.java.JavaVisibilities
|
import org.jetbrains.kotlin.load.java.JavaVisibilities
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.annotations.JVM_THROWS_ANNOTATION_FQ_NAME
|
import org.jetbrains.kotlin.resolve.annotations.JVM_THROWS_ANNOTATION_FQ_NAME
|
||||||
import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SYNTHETIC_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()
|
else -> iterator.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!kind.isSkippedInGenericSignature) {
|
if (annotated != null && !kind.isSkippedInGenericSignature && !annotated.isSyntheticMarkerParameter()) {
|
||||||
object : AnnotationCodegen(innerClassConsumer, context) {
|
object : AnnotationCodegen(innerClassConsumer, context) {
|
||||||
override fun visitAnnotation(descr: String?, visible: Boolean): AnnotationVisitor {
|
override fun visitAnnotation(descr: String?, visible: Boolean): AnnotationVisitor {
|
||||||
return mv.visitParameterAnnotation(
|
return mv.visitParameterAnnotation(
|
||||||
@@ -253,11 +255,15 @@ private fun generateParameterAnnotations(
|
|||||||
path, descr, visible
|
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) {
|
private fun generateParameterNames(irFunction: IrFunction, mv: MethodVisitor, jvmSignature: JvmMethodSignature, state: GenerationState) {
|
||||||
val iterator = irFunction.valueParameters.iterator()
|
val iterator = irFunction.valueParameters.iterator()
|
||||||
for (parameterSignature in jvmSignature.valueParameters) {
|
for (parameterSignature in jvmSignature.valueParameters) {
|
||||||
|
|||||||
+2
-2
@@ -272,8 +272,8 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
|
|||||||
|
|
||||||
accessor.addValueParameter(
|
accessor.addValueParameter(
|
||||||
"constructor_marker".synthesizedString,
|
"constructor_marker".synthesizedString,
|
||||||
context.ir.symbols.defaultConstructorMarker.defaultType,
|
context.ir.symbols.defaultConstructorMarker.defaultType.makeNullable(),
|
||||||
JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
|
JvmLoweredDeclarationOrigin.SYNTHETIC_MARKER_PARAMETER
|
||||||
)
|
)
|
||||||
|
|
||||||
accessor.body = IrExpressionBodyImpl(
|
accessor.body = IrExpressionBodyImpl(
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ public final class AnObject {
|
|||||||
public final class WithCompanion$Companion {
|
public final class WithCompanion$Companion {
|
||||||
inner class WithCompanion$Companion
|
inner class WithCompanion$Companion
|
||||||
private method <init>(): void
|
private method <init>(): void
|
||||||
public synthetic method <init>(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.internal.DefaultConstructorMarker): void
|
public synthetic method <init>(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 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
|
public final @kotlin.jvm.JvmStatic method foo(p0: int): void
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user