From 3f32e1cce9f858d61a51e805ddcf81d2c0b9243c Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 4 Jul 2018 18:57:34 +0200 Subject: [PATCH] Do not serialize empty property signature to JVM metadata This should have no effect on the correct code currently because all properties have at least a getter, but may help in debugging problems with serialized metadata for properties --- .../serialization/JvmSerializerExtension.kt | 8 ++++--- .../tools/kotlinp/testData/Annotations.txt | 21 ------------------- .../testData/LocalDelegatedProperties.txt | 6 ------ 3 files changed, 5 insertions(+), 30 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt index 923367e90ee..77b0810314d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt @@ -178,7 +178,9 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta if (setterMethod != null) signatureSerializer.methodSignature(null, setterMethod) else null ) - proto.setExtension(JvmProtoBuf.propertySignature, signature) + if (signature != null) { + proto.setExtension(JvmProtoBuf.propertySignature, signature) + } if (descriptor.isJvmFieldPropertyInInterfaceCompanion()) { proto.setExtension(JvmProtoBuf.flags, JvmFlags.getPropertyFlags(true)) @@ -262,7 +264,7 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta syntheticMethod: JvmProtoBuf.JvmMethodSignature?, getter: JvmProtoBuf.JvmMethodSignature?, setter: JvmProtoBuf.JvmMethodSignature? - ): JvmProtoBuf.JvmPropertySignature { + ): JvmProtoBuf.JvmPropertySignature? { val signature = JvmProtoBuf.JvmPropertySignature.newBuilder() if (fieldDesc != null) { @@ -281,7 +283,7 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta signature.setter = setter } - return signature.build() + return signature.build().takeIf { it.serializedSize > 0 } } fun fieldSignature( diff --git a/libraries/tools/kotlinp/testData/Annotations.txt b/libraries/tools/kotlinp/testData/Annotations.txt index 915964669ba..c6c49101949 100644 --- a/libraries/tools/kotlinp/testData/Annotations.txt +++ b/libraries/tools/kotlinp/testData/Annotations.txt @@ -5,83 +5,63 @@ public final annotation class A : kotlin/Annotation { // signature: (ZCBSIFJD[Z[C[B[S[I[F[J[DLjava/lang/String;Lkotlin/annotation/AnnotationTarget;Lkotlin/reflect/KClass;LB;)V public /* primary */ constructor(z: kotlin/Boolean, c: kotlin/Char, b: kotlin/Byte, s: kotlin/Short, i: kotlin/Int, f: kotlin/Float, j: kotlin/Long, d: kotlin/Double, za: kotlin/BooleanArray, ca: kotlin/CharArray, ba: kotlin/ByteArray, sa: kotlin/ShortArray, ia: kotlin/IntArray, fa: kotlin/FloatArray, ja: kotlin/LongArray, da: kotlin/DoubleArray, str: kotlin/String, enum: kotlin/annotation/AnnotationTarget, klass: kotlin/reflect/KClass<*>, anno: B) - // field: anno:LB; public final val anno: B public final get - // field: b:B public final val b: kotlin/Byte public final get - // field: ba:[B public final val ba: kotlin/ByteArray public final get - // field: c:C public final val c: kotlin/Char public final get - // field: ca:[C public final val ca: kotlin/CharArray public final get - // field: d:D public final val d: kotlin/Double public final get - // field: da:[D public final val da: kotlin/DoubleArray public final get - // field: enum:Lkotlin/annotation/AnnotationTarget; public final val enum: kotlin/annotation/AnnotationTarget public final get - // field: f:F public final val f: kotlin/Float public final get - // field: fa:[F public final val fa: kotlin/FloatArray public final get - // field: i:I public final val i: kotlin/Int public final get - // field: ia:[I public final val ia: kotlin/IntArray public final get - // field: j:J public final val j: kotlin/Long public final get - // field: ja:[J public final val ja: kotlin/LongArray public final get - // field: klass:Lkotlin/reflect/KClass; public final val klass: kotlin/reflect/KClass<*> public final get - // field: s:S public final val s: kotlin/Short public final get - // field: sa:[S public final val sa: kotlin/ShortArray public final get - // field: str:Ljava/lang/String; public final val str: kotlin/String public final get - // field: z:Z public final val z: kotlin/Boolean public final get - // field: za:[Z public final val za: kotlin/BooleanArray public final get } @@ -92,7 +72,6 @@ public final annotation class B : kotlin/Annotation { // signature: (Ljava/lang/String;)V public /* primary */ constructor(value: kotlin/String) - // field: value:Ljava/lang/String; public final val value: kotlin/String public final get } diff --git a/libraries/tools/kotlinp/testData/LocalDelegatedProperties.txt b/libraries/tools/kotlinp/testData/LocalDelegatedProperties.txt index aba69825e2c..7f9e2849505 100644 --- a/libraries/tools/kotlinp/testData/LocalDelegatedProperties.txt +++ b/libraries/tools/kotlinp/testData/LocalDelegatedProperties.txt @@ -9,17 +9,14 @@ public final class Class : kotlin/Any { public final fun f(): kotlin/Unit // local delegated property #0 - // field: local4:Lkotlin/Array; // local final /* delegated */ val local4: kotlin/Array // local final get // local delegated property #1 - // field: local5:Ljava/util/List; // local final /* delegated */ val local5: kotlin/collections/List? // local final get // local delegated property #2 - // field: local6:I // local final /* delegated */ val local6: kotlin/Int // local final get } @@ -65,17 +62,14 @@ package { public final /* non-default */ get // local delegated property #0 - // field: local1:D // local final /* delegated */ val local1: kotlin/Double // local final get // local delegated property #1 - // field: local2:Ljava/lang/Object; // local final /* delegated */ val local2: kotlin/Any // local final get // local delegated property #2 - // field: local3:Ljava/lang/CharSequence; // local final /* delegated */ val local3: kotlin/CharSequence? // local final get }