From e00b7a993faf18fe5f03ca77668cf1ec22effac9 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 27 Jun 2018 08:43:32 +0200 Subject: [PATCH] Write version requirements for @JvmField in interface companion --- .../incremental/JavaClassesSerializerExtension.kt | 8 ++++++-- .../codegen/serialization/JvmSerializerExtension.kt | 11 ++++++++++- .../kotlin/serialization/DescriptorSerializer.kt | 3 +-- .../kotlin/serialization/SerializerExtension.kt | 6 +++++- .../kotlin/serialization/SerializerExtensionBase.kt | 6 +++++- .../jvmFieldInInterfaceCompanion.kt | 9 +++++++++ .../kotlin/serialization/VersionRequirementTest.kt | 7 +++++++ .../js/KotlinJavascriptSerializerExtension.kt | 8 ++++++-- 8 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/versionRequirement/jvmFieldInInterfaceCompanion.kt diff --git a/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt b/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt index ae6c45ab404..c53a36fe299 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt @@ -58,8 +58,12 @@ class JavaClassesSerializerExtension : KotlinSerializerExtensionBase(BuiltInSeri } } - override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) { - super.serializeProperty(descriptor, proto) + override fun serializeProperty( + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable + ) { + super.serializeProperty(descriptor, proto, versionRequirementTable) if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) { proto.setExtension(JavaClassProtoBuf.isPackagePrivateField, true) } 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 a86455ac5a5..9de8c104f40 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt @@ -155,7 +155,11 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta } } - override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) { + override fun serializeProperty( + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable + ) { val signatureSerializer = SignatureSerializer() val getter = descriptor.getter @@ -181,6 +185,11 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta proto.setExtension(JvmProtoBuf.isMovedFromInterfaceCompanion, 1) } + if (JvmAbi.isInterfaceCompanionWithBackingFieldsInOuter(descriptor.containingDeclaration)) { + assert(!proto.hasVersionRequirement()) { "VersionRequirement should be empty for $descriptor" } + proto.versionRequirement = + writeVersionRequirement(1, 2, 70, ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, versionRequirementTable) + } } override fun serializeErrorType(type: KotlinType, builder: ProtoBuf.Type.Builder) { diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index b2788ebba55..b650cc3782a 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils.* import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.RequireKotlinNames -import org.jetbrains.kotlin.resolve.annotations.hasJvmDefaultAnnotation import org.jetbrains.kotlin.resolve.calls.components.isActualParameterWithAnyExpectedDefault import org.jetbrains.kotlin.resolve.checkers.KotlinVersionStringAnnotationValueChecker import org.jetbrains.kotlin.resolve.constants.EnumValue @@ -241,7 +240,7 @@ class DescriptorSerializer private constructor( builder.versionRequirement = writeVersionRequirementDependingOnCoroutinesVersion() } - extension.serializeProperty(descriptor, builder) + extension.serializeProperty(descriptor, builder, versionRequirementTable) return builder } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt index 7efa696ad7f..5461bdf4cbd 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt @@ -44,7 +44,11 @@ abstract class SerializerExtension { open fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { } - open fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) { + open fun serializeProperty( + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable + ) { } open fun serializeEnumEntry(descriptor: ClassDescriptor, proto: ProtoBuf.EnumEntry.Builder) { diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt index c9bf9c3e823..24e9e7cc3be 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt @@ -53,7 +53,11 @@ open class KotlinSerializerExtensionBase(private val protocol: SerializerExtensi } } - override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) { + override fun serializeProperty( + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable + ) { for (annotation in descriptor.nonSourceAnnotations) { proto.addExtension(protocol.propertyAnnotation, annotationSerializer.serializeAnnotation(annotation)) } diff --git a/compiler/testData/versionRequirement/jvmFieldInInterfaceCompanion.kt b/compiler/testData/versionRequirement/jvmFieldInInterfaceCompanion.kt new file mode 100644 index 00000000000..f73ec8cfa45 --- /dev/null +++ b/compiler/testData/versionRequirement/jvmFieldInInterfaceCompanion.kt @@ -0,0 +1,9 @@ +package test + +interface Base { + companion object { + @Suppress("INAPPLICABLE_JVM_FIELD") + @JvmField + val foo = object : Base {} + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/VersionRequirementTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/VersionRequirementTest.kt index 060cfcfbdd8..ee1095d6423 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/VersionRequirementTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/VersionRequirementTest.kt @@ -188,4 +188,11 @@ class VersionRequirementTest : TestCaseWithTmpdir() { ) ) } + + fun testJvmFieldInInterfaceCompanion() { + doTest( + VersionRequirement.Version(1, 2, 70), DeprecationLevel.ERROR, null, COMPILER_VERSION, null, + fqNames = listOf("test.Base.Companion.foo") + ) + } } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt index ac1251e584f..295ffe90a1f 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt @@ -54,12 +54,16 @@ class KotlinJavascriptSerializerExtension( super.serializeClass(descriptor, proto, versionRequirementTable) } - override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) { + override fun serializeProperty( + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable + ) { val id = getFileId(descriptor) if (id != null) { proto.setExtension(JsProtoBuf.propertyContainingFileId, id) } - super.serializeProperty(descriptor, proto) + super.serializeProperty(descriptor, proto, versionRequirementTable) } override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) {