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 8df91834ca7..60641960f9a 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,8 @@ 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_ACCESSOR_FOR_HIDDEN_CONSTRUCTOR : + IrDeclarationOriginImpl("SYNTHETIC_ACCESSOR_FOR_HIDDEN_CONSTRUCTOR", 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") diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt index 7c846bc8694..5e5e39a5041 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt @@ -277,12 +277,15 @@ abstract class AnnotationCodegen( companion object { private fun isInvisibleFromTheOutside(declaration: IrDeclaration?): Boolean { - if (declaration is IrSimpleFunction && declaration.origin === JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR) { + if (declaration is IrSimpleFunction && declaration.origin.isSynthetic) { return true } if (declaration is IrDeclarationWithVisibility) { return !declaration.visibility.isVisibleOutside() } + if (declaration is IrValueParameter && (declaration.parent as IrDeclaration).origin.isSynthetic) { + return true + } return false } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt index c8eceebd32f..aba10c779f4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt @@ -130,6 +130,7 @@ internal fun IrFunction.shouldContainSuspendMarkers(): Boolean = !isInvokeSuspen origin != JvmLoweredDeclarationOrigin.JVM_OVERLOADS_WRAPPER && origin != JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE && origin != JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR && + origin != JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR_FOR_HIDDEN_CONSTRUCTOR && origin != JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE && origin != JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE_TO_SYNTHETIC && origin != IrDeclarationOrigin.BRIDGE && 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 0a1bf9b0d45..c2488dbb656 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 @@ -69,7 +69,9 @@ class FunctionCodegen( generateParameterNames(irFunction, methodVisitor, signature, context.state) } - if (irFunction.origin != IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER) { + if (irFunction.origin != IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER && + irFunction.origin != JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR + ) { object : AnnotationCodegen(classCodegen, context) { override fun visitAnnotation(descr: String?, visible: Boolean): AnnotationVisitor { return methodVisitor.visitAnnotation(descr, visible) 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 58117655d19..f649fa0b6df 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 @@ -217,12 +217,13 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle get() = this in context.hiddenConstructors || ( !Visibilities.isPrivate(visibility) && !constructedClass.isInline && hasMangledParameters && origin != IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER && - origin != JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR) + origin != JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR && + origin != JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR_FOR_HIDDEN_CONSTRUCTOR) private fun handleHiddenConstructor(declaration: IrConstructor): IrConstructorImpl { require(declaration.isOrShouldBeHidden, declaration::render) return context.hiddenConstructors.getOrPut(declaration) { - declaration.makeConstructorAccessor().also { accessor -> + declaration.makeConstructorAccessor(JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR_FOR_HIDDEN_CONSTRUCTOR).also { accessor -> // There's a special case in the JVM backend for serializing the metadata of hidden // constructors - we serialize the descriptor of the original constructor, but the // signature of the accessor. We implement this special case in the JVM IR backend by @@ -249,11 +250,14 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle candidates.lastOrNull { parent is IrClass && it.isSubclassOf(parent) } ?: classes.last() } else parent - private fun IrConstructor.makeConstructorAccessor(): IrConstructorImpl { + private fun IrConstructor.makeConstructorAccessor( + originForConstructorAccessor: IrDeclarationOrigin = + JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR + ): IrConstructorImpl { val source = this return buildConstructor { - origin = JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR + origin = originForConstructorAccessor name = source.name visibility = Visibilities.PUBLIC }.also { accessor -> diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5_ir.txt index bfbba0e37bc..28ebb7d1f50 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5_ir.txt @@ -42,7 +42,7 @@ public final class Override5Kt$inlineMe$1$generic$2 { inner class Override5Kt$inlineMe$1$generic$2 static method (): void public method (): void - public synthetic bridge @org.jetbrains.annotations.Nullable method invoke(): java.lang.Object + public synthetic bridge method invoke(): java.lang.Object public final method invoke(): void } diff --git a/compiler/testData/codegen/bytecodeListing/annotations/noAnnotationsInSyntheticAccessors.kt b/compiler/testData/codegen/bytecodeListing/annotations/noAnnotationsInSyntheticAccessors.kt index 159caa5a807..b266aca852c 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/noAnnotationsInSyntheticAccessors.kt +++ b/compiler/testData/codegen/bytecodeListing/annotations/noAnnotationsInSyntheticAccessors.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR annotation class Ann class Foo private @Ann constructor(@Ann s: String) { diff --git a/compiler/testData/codegen/bytecodeListing/annotations/noAnnotationsInSyntheticAccessors_ir.txt b/compiler/testData/codegen/bytecodeListing/annotations/noAnnotationsInSyntheticAccessors_ir.txt new file mode 100644 index 00000000000..e5225eef1c3 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/annotations/noAnnotationsInSyntheticAccessors_ir.txt @@ -0,0 +1,22 @@ +@java.lang.annotation.Retention +@kotlin.Metadata +public annotation class Ann + +@kotlin.Metadata +public final class Foo$Companion { + inner class Foo$Companion + private method (): void + public synthetic method (p0: kotlin.jvm.internal.DefaultConstructorMarker): void + public final method foo(): void +} + +@kotlin.Metadata +public final class Foo { + public final static @org.jetbrains.annotations.NotNull field Companion: Foo$Companion + inner class Foo$Companion + static method (): void + private @Ann method (@Ann p0: java.lang.String): void + public synthetic method (p0: java.lang.String, p1: kotlin.jvm.internal.DefaultConstructorMarker): void + public synthetic final static method access$foo(p0: Foo, p1: java.lang.String): void + private final @Ann method foo(@Ann p0: java.lang.String): void +} diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/annotationsOnHiddenConstructor.kt b/compiler/testData/codegen/bytecodeListing/inlineClasses/annotationsOnHiddenConstructor.kt index 88ad2e947f8..a01c480422c 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/annotationsOnHiddenConstructor.kt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/annotationsOnHiddenConstructor.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND: JVM_IR annotation class Ann diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/annotationsOnHiddenConstructor_ir.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/annotationsOnHiddenConstructor_ir.txt new file mode 100644 index 00000000000..49d36da603e --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/annotationsOnHiddenConstructor_ir.txt @@ -0,0 +1,69 @@ +@java.lang.annotation.Retention +@kotlin.Metadata +public annotation class Ann + +@kotlin.Metadata +public final class Sealed$Derived { + inner class Sealed$Derived + private method (p0: int): void + public synthetic @Ann method (p0: int, p1: kotlin.jvm.internal.DefaultConstructorMarker): void +} + +@kotlin.Metadata +public final class Sealed$Inner { + synthetic final @org.jetbrains.annotations.NotNull field this$0: Sealed + private final field z2: int + inner class Sealed$Inner + public synthetic @Ann method (p0: Sealed, p1: int, @Ann p2: int, @Ann p3: java.lang.String, p4: kotlin.jvm.internal.DefaultConstructorMarker): void + private method (p0: Sealed, p1: int, p2: int, p3: java.lang.String): void + public final method getZ2-a_XrcN0(): int +} + +@kotlin.Metadata +public abstract class Sealed { + private final field z: int + inner class Sealed$Derived + inner class Sealed$Inner + private @Ann method (@Ann p0: int): void + public synthetic method (p0: int, p1: kotlin.jvm.internal.DefaultConstructorMarker): void + public final method getZ-a_XrcN0(): int +} + +@kotlin.Metadata +public final class Test$Inner { + synthetic final @org.jetbrains.annotations.NotNull field this$0: Test + private final field z2: int + inner class Test$Inner + public synthetic @Ann method (p0: Test, p1: int, @Ann p2: int, @Ann p3: java.lang.String, p4: kotlin.jvm.internal.DefaultConstructorMarker): void + private method (p0: Test, p1: int, p2: int, p3: java.lang.String): void + public final method getZ2-a_XrcN0(): int +} + +@kotlin.Metadata +public final class Test { + private final field z: int + inner class Test$Inner + public synthetic @Ann method (@Ann p0: int, p1: kotlin.jvm.internal.DefaultConstructorMarker): void + private method (p0: int): void + public synthetic @Ann method (p0: int, @Ann p1: int, p2: kotlin.jvm.internal.DefaultConstructorMarker): void + private @Ann method (p0: int, @Ann p1: java.lang.String): void + private method (p0: int, p1: int): void + public final method getZ-a_XrcN0(): int +} + +@kotlin.Metadata +public final class Z { + private final field x: int + private synthetic method (p0: int): void + public synthetic final static method box-impl(p0: int): Z + public static method constructor-impl(p0: int): int + public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean + public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean + public final static method equals-impl0(p0: int, p1: int): boolean + public final method getX(): int + public method hashCode(): int + public static method hashCode-impl(p0: int): int + public @org.jetbrains.annotations.NotNull method toString(): java.lang.String + public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String + public synthetic final method unbox-impl(): int +} diff --git a/compiler/testData/codegen/bytecodeListing/main/multifileSuspend_ir.txt b/compiler/testData/codegen/bytecodeListing/main/multifileSuspend_ir.txt index 852932f1dad..0a84654ae3d 100644 --- a/compiler/testData/codegen/bytecodeListing/main/multifileSuspend_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/main/multifileSuspend_ir.txt @@ -10,13 +10,13 @@ synthetic final class Hello/Foo__MultifileSuspendKt$main$2 { inner class Hello/Foo__MultifileSuspendKt$main$2 method (@org.jetbrains.annotations.NotNull p0: java.lang.String[]): void public final @org.jetbrains.annotations.Nullable method invoke(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object - public synthetic bridge @org.jetbrains.annotations.Nullable method invoke(@org.jetbrains.annotations.Nullable p0: java.lang.Object): java.lang.Object + public synthetic bridge method invoke(p0: java.lang.Object): java.lang.Object } @kotlin.Metadata @kotlin.jvm.JvmName synthetic final class Hello/Foo__MultifileSuspendKt { inner class Hello/Foo__MultifileSuspendKt$main$2 - public synthetic final static method main(@org.jetbrains.annotations.NotNull p0: java.lang.String[]): void public final static @org.jetbrains.annotations.Nullable method main(@org.jetbrains.annotations.NotNull p0: java.lang.String[], @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object + public synthetic final static method main(p0: java.lang.String[]): void } diff --git a/compiler/testData/codegen/bytecodeListing/main/parameterlessMain_ir.txt b/compiler/testData/codegen/bytecodeListing/main/parameterlessMain_ir.txt index cce0f0c777a..3d11eb1e22c 100644 --- a/compiler/testData/codegen/bytecodeListing/main/parameterlessMain_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/main/parameterlessMain_ir.txt @@ -1,5 +1,5 @@ @kotlin.Metadata public final class ParameterlessMainKt { public final static method main(): void - public synthetic final static method main(@org.jetbrains.annotations.NotNull p0: java.lang.String[]): void + public synthetic final static method main(p0: java.lang.String[]): void } diff --git a/compiler/testData/codegen/bytecodeListing/main/suspendMain_ir.txt b/compiler/testData/codegen/bytecodeListing/main/suspendMain_ir.txt index 2b4338410b0..bf2bcd5e44d 100644 --- a/compiler/testData/codegen/bytecodeListing/main/suspendMain_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/main/suspendMain_ir.txt @@ -4,12 +4,12 @@ synthetic final class SuspendMainKt$main$2 { inner class SuspendMainKt$main$2 method (@org.jetbrains.annotations.NotNull p0: java.lang.String[]): void public final @org.jetbrains.annotations.Nullable method invoke(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object - public synthetic bridge @org.jetbrains.annotations.Nullable method invoke(@org.jetbrains.annotations.Nullable p0: java.lang.Object): java.lang.Object + public synthetic bridge method invoke(p0: java.lang.Object): java.lang.Object } @kotlin.Metadata public final class SuspendMainKt { inner class SuspendMainKt$main$2 - public synthetic final static method main(@org.jetbrains.annotations.NotNull p0: java.lang.String[]): void public final static @org.jetbrains.annotations.Nullable method main(@org.jetbrains.annotations.NotNull p0: java.lang.String[], @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object + public synthetic final static method main(p0: java.lang.String[]): void }