From 34cf5a19dfdf4e3aac797a10532ea62fb0857696 Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Thu, 16 May 2019 12:55:38 +0200 Subject: [PATCH] JVM_IR: Support @JvmSynthetic annotations. --- .../backend/jvm/codegen/ClassCodegen.kt | 4 ++- .../backend/jvm/codegen/FunctionCodegen.kt | 6 +++- .../box/annotations/jvmAnnotationFlags.kt | 31 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index 9b4f7f717e7..f64f5dc22eb 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.AsmTypes +import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SYNTHETIC_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.TRANSIENT_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.VOLATILE_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin @@ -346,7 +347,8 @@ private val IrField.flags: Int (if (isFinal) Opcodes.ACC_FINAL else 0) or (if (isStatic) Opcodes.ACC_STATIC else 0) or (if (hasAnnotation(VOLATILE_ANNOTATION_FQ_NAME)) Opcodes.ACC_VOLATILE else 0) or - (if (hasAnnotation(TRANSIENT_ANNOTATION_FQ_NAME)) Opcodes.ACC_TRANSIENT else 0) + (if (hasAnnotation(TRANSIENT_ANNOTATION_FQ_NAME)) Opcodes.ACC_TRANSIENT else 0) or + (if (hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNTHETIC else 0) private val IrDeclarationOrigin.flags: Int get() = (if (isSynthetic) Opcodes.ACC_SYNTHETIC else 0) or 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 c8c9dfbe38f..ac571e0f4e1 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 @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.jvm.AsmTypes +import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SYNTHETIC_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.STRICTFP_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.SYNCHRONIZED_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature @@ -87,9 +88,12 @@ open class FunctionCodegen( else -> if (classCodegen.irClass.isJvmInterface && irFunction.body == null) Opcodes.ACC_ABSTRACT else 0 //TODO transform interface modality on lowering to DefaultImpls } val nativeFlag = if (irFunction.isExternal) Opcodes.ACC_NATIVE else 0 - val syntheticFlag = if (irFunction.origin.isSynthetic) Opcodes.ACC_SYNTHETIC else 0 + val syntheticFlag = + if (irFunction.origin.isSynthetic || irFunction.hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNTHETIC + else 0 val strictFpFlag = if (irFunction.hasAnnotation(STRICTFP_ANNOTATION_FQ_NAME)) Opcodes.ACC_STRICT else 0 val synchronizedFlag = if (irFunction.hasAnnotation(SYNCHRONIZED_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNCHRONIZED else 0 + return visibility or modalityFlag or staticFlag or diff --git a/compiler/testData/codegen/box/annotations/jvmAnnotationFlags.kt b/compiler/testData/codegen/box/annotations/jvmAnnotationFlags.kt index 81f9f10ed5e..6a491742843 100644 --- a/compiler/testData/codegen/box/annotations/jvmAnnotationFlags.kt +++ b/compiler/testData/codegen/box/annotations/jvmAnnotationFlags.kt @@ -17,6 +17,21 @@ class C { @Strictfp fun str() {} @Synchronized fun sync() {} + + @JvmSynthetic val synth = "ABC" + + var synth2 = 5 + @JvmSynthetic public get + @JvmSynthetic public set + + @field:JvmSynthetic + val synth3 = 0 + + @get:JvmSynthetic @set:JvmSynthetic + var synth4 = 0 + + @JvmSynthetic + fun synth5() {} } fun box(): String { @@ -29,5 +44,21 @@ fun box(): String { if (c.getDeclaredMethod("str").getModifiers() and Modifier.STRICT == 0) return "Fail: strict" if (c.getDeclaredMethod("sync").getModifiers() and Modifier.SYNCHRONIZED == 0) return "Fail: synchronized" + if (!c.getDeclaredField("synth").isSynthetic()) return "Fail: synthetic" + if (c.getDeclaredMethod("getSynth").isSynthetic()) return "Fail: get synthetic" + + if (c.getDeclaredField("synth2").isSynthetic()) return "Fail: synthetic 2" + if (!c.getDeclaredMethod("getSynth2").isSynthetic()) return "Fail: get synthetic 2" + if (!c.getDeclaredMethod("setSynth2", Int::class.java).isSynthetic()) return "Fail: set synthetic 2" + + if (!c.getDeclaredField("synth3").isSynthetic()) return "Fail: synthetic 3" + if (c.getDeclaredMethod("getSynth3").isSynthetic()) return "Fail: get synthetic 3" + + if (c.getDeclaredField("synth4").isSynthetic()) return "Fail: synthetic 4" + if (!c.getDeclaredMethod("getSynth4").isSynthetic()) return "Fail: get synthetic 4" + if (!c.getDeclaredMethod("setSynth4", Int::class.java).isSynthetic()) return "Fail: set synthetic 4" + + if (!c.getDeclaredMethod("synth5").isSynthetic()) return "Fail: synthetic 5" + return "OK" }