Write version requirements for @JvmField in interface companion

This commit is contained in:
Mikhael Bogdanov
2018-06-27 08:43:32 +02:00
parent b412c90cef
commit e00b7a993f
8 changed files with 49 additions and 9 deletions
@@ -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)
}
@@ -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) {
@@ -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
}
@@ -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) {
@@ -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))
}
@@ -0,0 +1,9 @@
package test
interface Base {
companion object {
@Suppress("INAPPLICABLE_JVM_FIELD")
@JvmField
val foo = object : Base {}
}
}
@@ -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")
)
}
}
@@ -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) {