Write 'RequireKotlin' annotation on @JvmDefault members

This commit is contained in:
Mikhael Bogdanov
2018-04-03 14:38:56 +02:00
parent 23e8adb793
commit 3f5fea05de
4 changed files with 30 additions and 10 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry
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
@@ -238,6 +239,8 @@ class DescriptorSerializer private constructor(
}
else if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
builder.versionRequirement = writeVersionRequirement(LanguageFeature.Coroutines)
} else if (descriptor.hasJvmDefaultAnnotation()) {
builder.versionRequirement = writeVersionRequirement(1, 2, 40)
}
extension.serializeProperty(descriptor, builder)
@@ -306,9 +309,10 @@ class DescriptorSerializer private constructor(
val requirement = serializeVersionRequirement(descriptor)
if (requirement != null) {
builder.versionRequirement = requirement
}
else if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
} else if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
builder.versionRequirement = writeVersionRequirement(LanguageFeature.Coroutines)
} else if (descriptor.hasJvmDefaultAnnotation()) {
builder.versionRequirement = writeVersionRequirement(1, 2, 40)
}
contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this)
@@ -626,6 +630,16 @@ class DescriptorSerializer private constructor(
return versionRequirementTable[requirement]
}
private fun writeVersionRequirement(major: Int, minor: Int, patch: Int): Int {
val requirement = ProtoBuf.VersionRequirement.newBuilder().apply {
VersionRequirement.Version(major, minor, patch).encode(
writeVersion = { version = it },
writeVersionFull = { versionFull = it }
)
}
return versionRequirementTable[requirement]
}
// Returns index into versionRequirementTable, or null if there's no @RequireKotlin on the descriptor
private fun serializeVersionRequirement(descriptor: DeclarationDescriptor): Int? {
val annotation = descriptor.annotations.findAnnotation(RequireKotlinNames.FQ_NAME) ?: return null