Support multiple version requirements on single element

This commit is contained in:
Alexander Udalov
2018-07-19 15:11:30 +02:00
parent b7df36643b
commit c011bf61fe
22 changed files with 1681 additions and 601 deletions
@@ -177,10 +177,7 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
if (!checkEquals(old.typeTable, new.typeTable)) return false
}
if (old.hasVersionRequirement() != new.hasVersionRequirement()) return false
if (old.hasVersionRequirement()) {
if (old.versionRequirement != new.versionRequirement) return false
}
if (!checkEqualsClassVersionRequirement(old, new)) return false
if (old.hasVersionRequirementTable() != new.hasVersionRequirementTable()) return false
if (old.hasVersionRequirementTable()) {
@@ -251,7 +248,7 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
ENUM_ENTRY_LIST,
SEALED_SUBCLASS_FQ_NAME_LIST,
TYPE_TABLE,
VERSION_REQUIREMENT,
VERSION_REQUIREMENT_LIST,
VERSION_REQUIREMENT_TABLE,
JVM_EXT_CLASS_MODULE_NAME,
JVM_EXT_CLASS_LOCAL_VARIABLE_LIST,
@@ -302,10 +299,7 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
if (!checkEquals(old.typeTable, new.typeTable)) result.add(ProtoBufClassKind.TYPE_TABLE)
}
if (old.hasVersionRequirement() != new.hasVersionRequirement()) result.add(ProtoBufClassKind.VERSION_REQUIREMENT)
if (old.hasVersionRequirement()) {
if (old.versionRequirement != new.versionRequirement) result.add(ProtoBufClassKind.VERSION_REQUIREMENT)
}
if (!checkEqualsClassVersionRequirement(old, new)) result.add(ProtoBufClassKind.VERSION_REQUIREMENT_LIST)
if (old.hasVersionRequirementTable() != new.hasVersionRequirementTable()) result.add(ProtoBufClassKind.VERSION_REQUIREMENT_TABLE)
if (old.hasVersionRequirementTable()) {
@@ -404,10 +398,7 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
if (!checkEquals(old.typeTable, new.typeTable)) return false
}
if (old.hasVersionRequirement() != new.hasVersionRequirement()) return false
if (old.hasVersionRequirement()) {
if (old.versionRequirement != new.versionRequirement) return false
}
if (!checkEqualsFunctionVersionRequirement(old, new)) return false
if (old.hasContract() != new.hasContract()) return false
if (old.hasContract()) {
@@ -510,10 +501,7 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
if (old.setterFlags != new.setterFlags) return false
}
if (old.hasVersionRequirement() != new.hasVersionRequirement()) return false
if (old.hasVersionRequirement()) {
if (old.versionRequirement != new.versionRequirement) return false
}
if (!checkEqualsPropertyVersionRequirement(old, new)) return false
if (old.hasExtension(JvmProtoBuf.propertySignature) != new.hasExtension(JvmProtoBuf.propertySignature)) return false
if (old.hasExtension(JvmProtoBuf.propertySignature)) {
@@ -603,10 +591,7 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
if (!checkEqualsTypeAliasAnnotation(old, new)) return false
if (old.hasVersionRequirement() != new.hasVersionRequirement()) return false
if (old.hasVersionRequirement()) {
if (old.versionRequirement != new.versionRequirement) return false
}
if (!checkEqualsTypeAliasVersionRequirement(old, new)) return false
return true
}
@@ -788,10 +773,7 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
if (!checkEqualsConstructorValueParameter(old, new)) return false
if (old.hasVersionRequirement() != new.hasVersionRequirement()) return false
if (old.hasVersionRequirement()) {
if (old.versionRequirement != new.versionRequirement) return false
}
if (!checkEqualsConstructorVersionRequirement(old, new)) return false
if (old.hasExtension(JvmProtoBuf.constructorSignature) != new.hasExtension(JvmProtoBuf.constructorSignature)) return false
if (old.hasExtension(JvmProtoBuf.constructorSignature)) {
@@ -1262,6 +1244,16 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
return true
}
open fun checkEqualsClassVersionRequirement(old: ProtoBuf.Class, new: ProtoBuf.Class): Boolean {
if (old.versionRequirementCount != new.versionRequirementCount) return false
for(i in 0..old.versionRequirementCount - 1) {
if (old.getVersionRequirement(i) != new.getVersionRequirement(i)) return false
}
return true
}
open fun checkEqualsFunctionTypeParameter(old: ProtoBuf.Function, new: ProtoBuf.Function): Boolean {
if (old.typeParameterCount != new.typeParameterCount) return false
@@ -1282,6 +1274,16 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
return true
}
open fun checkEqualsFunctionVersionRequirement(old: ProtoBuf.Function, new: ProtoBuf.Function): Boolean {
if (old.versionRequirementCount != new.versionRequirementCount) return false
for(i in 0..old.versionRequirementCount - 1) {
if (old.getVersionRequirement(i) != new.getVersionRequirement(i)) return false
}
return true
}
open fun checkEqualsPropertyTypeParameter(old: ProtoBuf.Property, new: ProtoBuf.Property): Boolean {
if (old.typeParameterCount != new.typeParameterCount) return false
@@ -1292,6 +1294,16 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
return true
}
open fun checkEqualsPropertyVersionRequirement(old: ProtoBuf.Property, new: ProtoBuf.Property): Boolean {
if (old.versionRequirementCount != new.versionRequirementCount) return false
for(i in 0..old.versionRequirementCount - 1) {
if (old.getVersionRequirement(i) != new.getVersionRequirement(i)) return false
}
return true
}
open fun checkEqualsTypeAliasTypeParameter(old: ProtoBuf.TypeAlias, new: ProtoBuf.TypeAlias): Boolean {
if (old.typeParameterCount != new.typeParameterCount) return false
@@ -1312,6 +1324,16 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
return true
}
open fun checkEqualsTypeAliasVersionRequirement(old: ProtoBuf.TypeAlias, new: ProtoBuf.TypeAlias): Boolean {
if (old.versionRequirementCount != new.versionRequirementCount) return false
for(i in 0..old.versionRequirementCount - 1) {
if (old.getVersionRequirement(i) != new.getVersionRequirement(i)) return false
}
return true
}
open fun checkEqualsTypeTableType(old: ProtoBuf.TypeTable, new: ProtoBuf.TypeTable): Boolean {
if (old.typeCount != new.typeCount) return false
@@ -1372,6 +1394,16 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
return true
}
open fun checkEqualsConstructorVersionRequirement(old: ProtoBuf.Constructor, new: ProtoBuf.Constructor): Boolean {
if (old.versionRequirementCount != new.versionRequirementCount) return false
for(i in 0..old.versionRequirementCount - 1) {
if (old.getVersionRequirement(i) != new.getVersionRequirement(i)) return false
}
return true
}
open fun checkEqualsAnnotationArgument(old: ProtoBuf.Annotation, new: ProtoBuf.Annotation): Boolean {
if (old.argumentCount != new.argumentCount) return false
@@ -1562,8 +1594,8 @@ fun ProtoBuf.Class.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) ->
hashCode = 31 * hashCode + typeTable.hashCode(stringIndexes, fqNameIndexes)
}
if (hasVersionRequirement()) {
hashCode = 31 * hashCode + versionRequirement
for(i in 0..versionRequirementCount - 1) {
hashCode = 31 * hashCode + getVersionRequirement(i)
}
if (hasVersionRequirementTable()) {
@@ -1642,8 +1674,8 @@ fun ProtoBuf.Function.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int)
hashCode = 31 * hashCode + typeTable.hashCode(stringIndexes, fqNameIndexes)
}
if (hasVersionRequirement()) {
hashCode = 31 * hashCode + versionRequirement
for(i in 0..versionRequirementCount - 1) {
hashCode = 31 * hashCode + getVersionRequirement(i)
}
if (hasContract()) {
@@ -1726,8 +1758,8 @@ fun ProtoBuf.Property.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int)
hashCode = 31 * hashCode + setterFlags
}
if (hasVersionRequirement()) {
hashCode = 31 * hashCode + versionRequirement
for(i in 0..versionRequirementCount - 1) {
hashCode = 31 * hashCode + getVersionRequirement(i)
}
if (hasExtension(JvmProtoBuf.propertySignature)) {
@@ -1802,8 +1834,8 @@ fun ProtoBuf.TypeAlias.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int
hashCode = 31 * hashCode + getAnnotation(i).hashCode(stringIndexes, fqNameIndexes)
}
if (hasVersionRequirement()) {
hashCode = 31 * hashCode + versionRequirement
for(i in 0..versionRequirementCount - 1) {
hashCode = 31 * hashCode + getVersionRequirement(i)
}
return hashCode
@@ -1960,8 +1992,8 @@ fun ProtoBuf.Constructor.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (I
hashCode = 31 * hashCode + getValueParameter(i).hashCode(stringIndexes, fqNameIndexes)
}
if (hasVersionRequirement()) {
hashCode = 31 * hashCode + versionRequirement
for(i in 0..versionRequirementCount - 1) {
hashCode = 31 * hashCode + getVersionRequirement(i)
}
if (hasExtension(JvmProtoBuf.constructorSignature)) {
@@ -223,7 +223,7 @@ class DifferenceCalculatorForClass(
ProtoBufClassKind.TYPE_TABLE -> {
// TODO
}
ProtoCompareGenerated.ProtoBufClassKind.VERSION_REQUIREMENT,
ProtoCompareGenerated.ProtoBufClassKind.VERSION_REQUIREMENT_LIST,
ProtoCompareGenerated.ProtoBufClassKind.VERSION_REQUIREMENT_TABLE -> {
// TODO
}
File diff suppressed because it is too large Load Diff
@@ -76,9 +76,9 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta
it is CallableMemberDescriptor && it.hasJvmDefaultAnnotation()
}
) {
assert(!builder.hasVersionRequirement()) { "VersionRequirement should be empty for $classDescriptor" }
builder.versionRequirement =
writeVersionRequirement(1, 2, 40, ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, versionRequirementTable)
builder.addVersionRequirement(
writeVersionRequirement(1, 2, 40, ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, versionRequirementTable)
)
}
}
@@ -183,9 +183,9 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta
if (descriptor.isJvmFieldPropertyInInterfaceCompanion()) {
proto.setExtension(JvmProtoBuf.flags, JvmFlags.getPropertyFlags(true))
assert(!proto.hasVersionRequirement()) { "VersionRequirement should be empty for $descriptor" }
proto.versionRequirement =
writeVersionRequirement(1, 2, 70, ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, versionRequirementTable)
proto.addVersionRequirement(
writeVersionRequirement(1, 2, 70, ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, versionRequirementTable)
)
}
}
@@ -310,7 +310,9 @@ class DeprecationResolver(
result.add(deprecation)
}
getDeprecationByVersionRequirement(target)?.let(result::add)
for (deprecation in getDeprecationByVersionRequirement(target)) {
result.add(deprecation)
}
getDeprecationByCoroutinesVersion(target)?.let(result::add)
}
@@ -356,30 +358,33 @@ class DeprecationResolver(
DeprecatedExperimentalCoroutine(target)
else null
private fun getDeprecationByVersionRequirement(target: DeclarationDescriptor): DeprecatedByVersionRequirement? {
private fun getDeprecationByVersionRequirement(target: DeclarationDescriptor): List<DeprecatedByVersionRequirement> {
fun createVersion(version: String): MavenComparableVersion? = try {
MavenComparableVersion(version)
} catch (e: Exception) {
null
}
val versionRequirement =
(target as? DeserializedMemberDescriptor)?.versionRequirement
?: (target as? DeserializedClassDescriptor)?.versionRequirement
?: return null
val requiredVersion = createVersion(versionRequirement.version.asString())
val currentVersion = when (versionRequirement.kind) {
ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION ->
MavenComparableVersion(languageVersionSettings.languageVersion.versionString)
ProtoBuf.VersionRequirement.VersionKind.API_VERSION ->
languageVersionSettings.apiVersion.version
ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION ->
KotlinCompilerVersion.getVersion()?.substringBefore('-')?.let(::createVersion)
else -> null
val versionRequirements =
(target as? DeserializedMemberDescriptor)?.versionRequirements
?: (target as? DeserializedClassDescriptor)?.versionRequirements
?: return emptyList()
return versionRequirements.mapNotNull { versionRequirement ->
val requiredVersion = createVersion(versionRequirement.version.asString())
val currentVersion = when (versionRequirement.kind) {
ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION ->
MavenComparableVersion(languageVersionSettings.languageVersion.versionString)
ProtoBuf.VersionRequirement.VersionKind.API_VERSION ->
languageVersionSettings.apiVersion.version
ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION ->
KotlinCompilerVersion.getVersion()?.substringBefore('-')?.let(::createVersion)
else -> null
}
if (currentVersion != null && currentVersion < requiredVersion)
DeprecatedByVersionRequirement(versionRequirement, target)
else
null
}
if (currentVersion != null && currentVersion < requiredVersion) {
return DeprecatedByVersionRequirement(versionRequirement, target)
}
return null
}
}
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.builtins.transformSuspendFunctionToRuntimeFunctionTy
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotated
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement
@@ -141,10 +142,7 @@ class DescriptorSerializer private constructor(
builder.typeTable = typeTableProto
}
val requirement = serializeVersionRequirement(classDescriptor)
if (requirement != null) {
builder.versionRequirement = requirement
}
builder.addAllVersionRequirement(serializeVersionRequirements(classDescriptor))
extension.serializeClass(classDescriptor, builder, versionRequirementTable)
@@ -235,11 +233,10 @@ class DescriptorSerializer private constructor(
}
}
val requirement = serializeVersionRequirement(descriptor)
if (requirement != null) {
builder.versionRequirement = requirement
} else if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
builder.versionRequirement = writeVersionRequirementDependingOnCoroutinesVersion()
builder.addAllVersionRequirement(serializeVersionRequirements(descriptor))
if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion())
}
extension.serializeProperty(descriptor, builder, versionRequirementTable)
@@ -305,11 +302,10 @@ class DescriptorSerializer private constructor(
}
}
val requirement = serializeVersionRequirement(descriptor)
if (requirement != null) {
builder.versionRequirement = requirement
} else if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
builder.versionRequirement = writeVersionRequirementDependingOnCoroutinesVersion()
builder.addAllVersionRequirement(serializeVersionRequirements(descriptor))
if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion())
}
contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this)
@@ -335,11 +331,10 @@ class DescriptorSerializer private constructor(
builder.addValueParameter(local.valueParameter(valueParameterDescriptor))
}
val requirement = serializeVersionRequirement(descriptor)
if (requirement != null) {
builder.versionRequirement = requirement
} else if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
builder.versionRequirement = writeVersionRequirementDependingOnCoroutinesVersion()
builder.addAllVersionRequirement(serializeVersionRequirements(descriptor))
if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion())
}
extension.serializeConstructor(descriptor, builder)
@@ -392,10 +387,7 @@ class DescriptorSerializer private constructor(
builder.setExpandedType(local.type(expandedType))
}
val requirement = serializeVersionRequirement(descriptor)
if (requirement != null) {
builder.versionRequirement = requirement
}
builder.addAllVersionRequirement(serializeVersionRequirements(descriptor))
for (annotation in descriptor.nonSourceAnnotations) {
builder.addAnnotation(extension.annotationSerializer.serializeAnnotation(annotation))
@@ -633,9 +625,13 @@ class DescriptorSerializer private constructor(
return writeVersionRequirement(major, minor, patch, versionKind, versionRequirementTable)
}
// 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
// Returns a list of indices into versionRequirementTable, or empty list if there's no @RequireKotlin on the descriptor
private fun serializeVersionRequirements(descriptor: DeclarationDescriptor): List<Int> =
descriptor.annotations
.filter { it.fqName == RequireKotlinNames.FQ_NAME }
.mapNotNull(::serializeVersionRequirementFromRequireKotlin)
private fun serializeVersionRequirementFromRequireKotlin(annotation: AnnotationDescriptor): Int? {
val args = annotation.allValueArguments
val versionString = (args[RequireKotlinNames.VERSION] as? StringValue)?.value ?: return null
@@ -0,0 +1,27 @@
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
package a
import kotlin.internal.RequireKotlin as RK
import kotlin.internal.RequireKotlinVersionKind as K
@RK("42.33", message = "This declaration is only supported since Kotlin 42.33")
@RK("40.34", versionKind = K.API_VERSION)
@RK("45.35")
class A
@RK("42.33", message = "This declaration is only supported since Kotlin 42.33")
@RK("40.34", versionKind = K.API_VERSION)
@RK("45.35")
@RK("1.1")
fun f() {}
@RK("42.33", message = "This declaration is only supported since Kotlin 42.33")
@RK("40.34", versionKind = K.API_VERSION)
@RK("45.35")
val p = ""
@RK("42.33", message = "This declaration is only supported since Kotlin 42.33")
@RK("40.34", versionKind = K.API_VERSION)
@RK("45.35")
@RK("1.1")
typealias TA = String
@@ -0,0 +1,37 @@
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:3:13: error: 'A' is only available since Kotlin 42.33 and cannot be used in Kotlin 1.2. This declaration is only supported since Kotlin 42.33
fun test(a: A): TA {
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:3:13: error: 'A' is only available since Kotlin 40.34 and cannot be used in Kotlin 1.2
fun test(a: A): TA {
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:3:13: error: 'A' is only available since Kotlin 45.35 and cannot be used in Kotlin 1.2
fun test(a: A): TA {
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:3:17: error: 'typealias TA = String' is only available since Kotlin 42.33 and cannot be used in Kotlin 1.2. This declaration is only supported since Kotlin 42.33
fun test(a: A): TA {
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:3:17: error: 'typealias TA = String' is only available since Kotlin 40.34 and cannot be used in Kotlin 1.2
fun test(a: A): TA {
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:3:17: error: 'typealias TA = String' is only available since Kotlin 45.35 and cannot be used in Kotlin 1.2
fun test(a: A): TA {
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:4:5: error: 'f(): Unit' is only available since Kotlin 42.33 and cannot be used in Kotlin 1.2. This declaration is only supported since Kotlin 42.33
f()
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:4:5: error: 'f(): Unit' is only available since Kotlin 40.34 and cannot be used in Kotlin 1.2
f()
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:4:5: error: 'f(): Unit' is only available since Kotlin 45.35 and cannot be used in Kotlin 1.2
f()
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:5:12: error: 'p: String' is only available since Kotlin 42.33 and cannot be used in Kotlin 1.2. This declaration is only supported since Kotlin 42.33
return p
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:5:12: error: 'p: String' is only available since Kotlin 40.34 and cannot be used in Kotlin 1.2
return p
^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlin/source.kt:5:12: error: 'p: String' is only available since Kotlin 45.35 and cannot be used in Kotlin 1.2
return p
^
COMPILATION_ERROR
@@ -0,0 +1,6 @@
import a.*
fun test(a: A): TA {
f()
return p
}
@@ -296,6 +296,10 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
doTestKotlinLibraryWithWrongMetadataVersionJs("library", "-Xskip-metadata-version-check")
}
fun testRequireKotlin() {
compileKotlin("source.kt", tmpdir, listOf(compileLibrary("library")))
}
fun testRequireKotlinInNestedClasses() {
compileKotlin("source.kt", tmpdir, listOf(compileLibrary("library")))
}
@@ -37,8 +37,8 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
val descriptor = module.findUnambiguousDescriptorByFqName(fqName)
val requirement = when (descriptor) {
is DeserializedMemberDescriptor -> descriptor.versionRequirement
is DeserializedClassDescriptor -> descriptor.versionRequirement
is DeserializedMemberDescriptor -> descriptor.versionRequirements.single()
is DeserializedClassDescriptor -> descriptor.versionRequirements.single()
else -> throw AssertionError("Unknown descriptor: $descriptor")
} ?: throw AssertionError("No VersionRequirement for $descriptor")
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.builtins.isSuspendFunctionTypeOrSubtype
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget
@@ -138,7 +137,7 @@ class MemberDeserializer(private val c: DeserializationContext) {
}
private fun DeserializedMemberDescriptor.versionAndReleaseCoroutinesMismatch(): Boolean =
c.components.configuration.releaseCoroutines && versionRequirement?.version != VersionRequirement.Version(1, 3)
c.components.configuration.releaseCoroutines && versionRequirements.none { it.version == VersionRequirement.Version(1, 3) }
private fun loadOldFlags(oldFlags: Int): Int {
val lowSixBits = oldFlags and 0x3f
@@ -231,7 +230,7 @@ class MemberDeserializer(private val c: DeserializationContext) {
descriptor.isExperimentalCoroutineInReleaseEnvironment = local.typeDeserializer.experimentalSuspendFunctionTypeEncountered ||
((c.containingDeclaration as? DeserializedClassDescriptor)?.c?.typeDeserializer?.experimentalSuspendFunctionTypeEncountered == true &&
c.components.configuration.releaseCoroutines &&
descriptor.versionRequirement?.version != VersionRequirement.Version(1, 3))
descriptor.versionRequirements.none { it.version == VersionRequirement.Version(1, 3) })
return descriptor
}
@@ -66,7 +66,7 @@ class DeserializedClassDescriptor(
(containingDeclaration as? DeserializedClassDescriptor)?.thisAsProtoContainer
)
val versionRequirement: VersionRequirement?
val versionRequirements: List<VersionRequirement>
get() = VersionRequirement.create(classProto, c.nameResolver, c.versionRequirementTable)
override val annotations =
@@ -27,7 +27,7 @@ interface DeserializedMemberDescriptor : MemberDescriptor {
val versionRequirementTable: VersionRequirementTable
val versionRequirement: VersionRequirement?
val versionRequirements: List<VersionRequirement>
get() = VersionRequirement.create(proto, nameResolver, versionRequirementTable)
// Information about the origin of this callable's container (class or package part on JVM) or null if there's no such information.
+5 -5
View File
@@ -220,7 +220,7 @@ message Class {
optional TypeTable type_table = 30;
// Index into the VersionRequirementTable
optional int32 version_requirement = 31;
repeated int32 version_requirement = 31;
optional VersionRequirementTable version_requirement_table = 32;
@@ -258,7 +258,7 @@ message Constructor {
repeated ValueParameter value_parameter = 2;
// Index into the VersionRequirementTable
optional int32 version_requirement = 31;
repeated int32 version_requirement = 31;
extensions 100 to 18999;
}
@@ -295,7 +295,7 @@ message Function {
optional TypeTable type_table = 30;
// Index into the VersionRequirementTable
optional int32 version_requirement = 31;
repeated int32 version_requirement = 31;
optional Contract contract = 32;
@@ -349,7 +349,7 @@ message Property {
optional int32 setter_flags = 8;
// Index into the VersionRequirementTable
optional int32 version_requirement = 31;
repeated int32 version_requirement = 31;
extensions 100 to 18999;
}
@@ -394,7 +394,7 @@ message TypeAlias {
repeated Annotation annotation = 8;
// Index into the VersionRequirementTable
optional int32 version_requirement = 31;
repeated int32 version_requirement = 31;
extensions 100 to 199;
}
File diff suppressed because it is too large Load Diff
@@ -81,16 +81,20 @@ class VersionRequirement(
"since $version $level" + (if (errorCode != null) " error $errorCode" else "") + (if (message != null) ": $message" else "")
companion object {
fun create(proto: MessageLite, nameResolver: NameResolver, table: VersionRequirementTable): VersionRequirement? {
val id = when (proto) {
is ProtoBuf.Class -> if (proto.hasVersionRequirement()) proto.versionRequirement else return null
is ProtoBuf.Constructor -> if (proto.hasVersionRequirement()) proto.versionRequirement else return null
is ProtoBuf.Function -> if (proto.hasVersionRequirement()) proto.versionRequirement else return null
is ProtoBuf.Property -> if (proto.hasVersionRequirement()) proto.versionRequirement else return null
is ProtoBuf.TypeAlias -> if (proto.hasVersionRequirement()) proto.versionRequirement else return null
fun create(proto: MessageLite, nameResolver: NameResolver, table: VersionRequirementTable): List<VersionRequirement> {
val ids = when (proto) {
is ProtoBuf.Class -> proto.versionRequirementList
is ProtoBuf.Constructor -> proto.versionRequirementList
is ProtoBuf.Function -> proto.versionRequirementList
is ProtoBuf.Property -> proto.versionRequirementList
is ProtoBuf.TypeAlias -> proto.versionRequirementList
else -> throw IllegalStateException("Unexpected declaration: ${proto::class.java}")
}
return ids.mapNotNull { id -> create(id, nameResolver, table) }
}
fun create(id: Int, nameResolver: NameResolver, table: VersionRequirementTable): VersionRequirement? {
val info = table[id] ?: return null
val version = Version.decode(
@@ -9,7 +9,6 @@ import kotlinx.metadata.*
import kotlinx.metadata.impl.extensions.MetadataExtensions
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.*
import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.metadata.deserialization.Flags as F
class ReadContext(
@@ -77,8 +76,8 @@ fun ProtoBuf.Class.accept(v: KmClassVisitor, strings: NameResolver) {
v.visitSealedSubclass(c.className(sealedSubclassFqName))
}
if (hasVersionRequirement()) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(it, c) }
for (versionRequirement in versionRequirementList) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(versionRequirement, it, c) }
}
for (extension in c.extensions) {
@@ -134,8 +133,8 @@ private fun ProtoBuf.Constructor.accept(v: KmConstructorVisitor, c: ReadContext)
v.visitValueParameter(parameter.flags, c[parameter.name])?.let { parameter.accept(it, c) }
}
if (hasVersionRequirement()) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(it, c) }
for (versionRequirement in versionRequirementList) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(versionRequirement, it, c) }
}
for (extension in c.extensions) {
@@ -168,8 +167,8 @@ private fun ProtoBuf.Function.accept(v: KmFunctionVisitor, outer: ReadContext) {
v.visitContract()?.let { contract.accept(it, c) }
}
if (hasVersionRequirement()) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(it, c) }
for (versionRequirement in versionRequirementList) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(versionRequirement, it, c) }
}
for (extension in c.extensions) {
@@ -199,8 +198,8 @@ fun ProtoBuf.Property.accept(v: KmPropertyVisitor, outer: ReadContext) {
v.visitReturnType(returnType.typeFlags)?.let { returnType.accept(it, c) }
}
if (hasVersionRequirement()) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(it, c) }
for (versionRequirement in versionRequirementList) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(versionRequirement, it, c) }
}
for (extension in c.extensions) {
@@ -229,8 +228,8 @@ private fun ProtoBuf.TypeAlias.accept(v: KmTypeAliasVisitor, outer: ReadContext)
v.visitAnnotation(annotation.readAnnotation(c.strings))
}
if (hasVersionRequirement()) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(it, c) }
for (versionRequirement in versionRequirementList) {
v.visitVersionRequirement()?.let { acceptVersionRequirementVisitor(versionRequirement, it, c) }
}
v.visitEnd()
@@ -327,9 +326,9 @@ private fun ProtoBuf.Type.accept(v: KmTypeVisitor, c: ReadContext) {
v.visitEnd()
}
private fun MessageLite.acceptVersionRequirementVisitor(v: KmVersionRequirementVisitor, c: ReadContext) {
val message = VersionRequirement.create(this, c.strings, c.versionRequirements)
?: throw InconsistentKotlinMetadataException("No VersionRequirement with the given id in the table")
private fun acceptVersionRequirementVisitor(id: Int, v: KmVersionRequirementVisitor, c: ReadContext) {
val message = VersionRequirement.create(id, c.strings, c.versionRequirements)
?: throw InconsistentKotlinMetadataException("No VersionRequirement with the given id in the table")
val kind = when (message.kind) {
ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION -> KmVersionRequirementVersionKind.LANGUAGE_VERSION
@@ -139,7 +139,7 @@ private fun writeConstructor(c: WriteContext, flags: Flags, output: (ProtoBuf.Co
writeValueParameter(c, flags, name) { t.addValueParameter(it.build()) }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
writeVersionRequirement(c) { t.versionRequirement = it }
writeVersionRequirement(c) { t.addVersionRequirement(it) }
override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor? =
c.applySingleExtension(type) {
@@ -171,7 +171,7 @@ private fun writeFunction(c: WriteContext, flags: Flags, name: String, output: (
writeType(c, flags) { t.returnType = it.build() }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
writeVersionRequirement(c) { t.versionRequirement = it }
writeVersionRequirement(c) { t.addVersionRequirement(it) }
override fun visitContract(): KmContractVisitor? =
writeContract(c) { t.contract = it.build() }
@@ -208,7 +208,7 @@ fun writeProperty(
writeType(c, flags) { t.returnType = it.build() }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
writeVersionRequirement(c) { t.versionRequirement = it }
writeVersionRequirement(c) { t.addVersionRequirement(it) }
override fun visitExtensions(type: KmExtensionType): KmPropertyExtensionVisitor? =
c.applySingleExtension(type) {
@@ -268,7 +268,7 @@ private fun writeTypeAlias(
}
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
writeVersionRequirement(c) { t.versionRequirement = it }
writeVersionRequirement(c) { t.addVersionRequirement(it) }
override fun visitEnd() {
if (flags != ProtoBuf.TypeAlias.getDefaultInstance().flags) {
@@ -453,7 +453,7 @@ open class ClassWriter(stringTable: StringTable) : KmClassVisitor() {
}
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
writeVersionRequirement(c) { t.versionRequirement = it }
writeVersionRequirement(c) { t.addVersionRequirement(it) }
override fun visitExtensions(type: KmExtensionType): KmClassExtensionVisitor? =
c.applySingleExtension(type) {
@@ -84,6 +84,7 @@ internal annotation class AccessibleLateinitPropertyLiteral
*/
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.TYPEALIAS)
@Retention(AnnotationRetention.SOURCE)
@Repeatable
@SinceKotlin("1.2")
internal annotation class RequireKotlin(
val version: String,
@@ -18,7 +18,7 @@ private fun visitFunction(settings: KotlinpSettings, sb: StringBuilder, flags: F
val params = mutableListOf<String>()
var receiverParameterType: String? = null
var returnType: String? = null
var versionRequirement: String? = null
val versionRequirements = mutableListOf<String>()
var jvmDesc: JvmMemberSignature? = null
var lambdaClassOriginName: String? = null
@@ -37,7 +37,7 @@ private fun visitFunction(settings: KotlinpSettings, sb: StringBuilder, flags: F
printType(flags) { returnType = it }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
printVersionRequirement { versionRequirement = it }
printVersionRequirement { versionRequirements.add(it) }
override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? {
if (type != JvmFunctionExtensionVisitor.TYPE) return null
@@ -57,7 +57,7 @@ private fun visitFunction(settings: KotlinpSettings, sb: StringBuilder, flags: F
if (lambdaClassOriginName != null) {
sb.appendln(" // lambda class origin: $lambdaClassOriginName")
}
if (versionRequirement != null) {
for (versionRequirement in versionRequirements) {
sb.appendln(" // $versionRequirement")
}
if (jvmDesc != null) {
@@ -90,7 +90,7 @@ private fun visitProperty(
var receiverParameterType: String? = null
var returnType: String? = null
var setterParameter: String? = null
var versionRequirement: String? = null
val versionRequirements = mutableListOf<String>()
var jvmFieldDesc: JvmMemberSignature? = null
var jvmGetterDesc: JvmMemberSignature? = null
var jvmSetterDesc: JvmMemberSignature? = null
@@ -109,7 +109,7 @@ private fun visitProperty(
printType(flags) { returnType = it }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
printVersionRequirement { versionRequirement = it }
printVersionRequirement { versionRequirements.add(it) }
override fun visitExtensions(type: KmExtensionType): KmPropertyExtensionVisitor? {
if (type != JvmPropertyExtensionVisitor.TYPE) return null
@@ -128,7 +128,7 @@ private fun visitProperty(
override fun visitEnd() {
sb.appendln()
if (versionRequirement != null) {
for (versionRequirement in versionRequirements) {
sb.appendln(" // $versionRequirement")
}
if (jvmFieldDesc != null) {
@@ -181,14 +181,14 @@ private fun visitProperty(
private fun visitConstructor(sb: StringBuilder, flags: Flags): KmConstructorVisitor =
object : KmConstructorVisitor() {
val params = mutableListOf<String>()
var versionRequirement: String? = null
val versionRequirements = mutableListOf<String>()
var jvmDesc: JvmMemberSignature? = null
override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? =
printValueParameter(flags, name) { params.add(it) }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
printVersionRequirement { versionRequirement = it }
printVersionRequirement { versionRequirements.add(it) }
override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor? {
if (type != JvmConstructorExtensionVisitor.TYPE) return null
@@ -201,7 +201,7 @@ private fun visitConstructor(sb: StringBuilder, flags: Flags): KmConstructorVisi
override fun visitEnd() {
sb.appendln()
if (versionRequirement != null) {
for (versionRequirement in versionRequirements) {
sb.appendln(" // $versionRequirement")
}
if (jvmDesc != null) {
@@ -221,7 +221,7 @@ private fun visitTypeAlias(settings: KotlinpSettings, sb: StringBuilder, flags:
val typeParams = mutableListOf<String>()
var underlyingType: String? = null
var expandedType: String? = null
var versionRequirement: String? = null
val versionRequirements = mutableListOf<String>()
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
printTypeParameter(settings, flags, name, id, variance) { typeParams.add(it) }
@@ -237,11 +237,11 @@ private fun visitTypeAlias(settings: KotlinpSettings, sb: StringBuilder, flags:
}
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
printVersionRequirement { versionRequirement = it }
printVersionRequirement { versionRequirements.add(it) }
override fun visitEnd() {
sb.appendln()
if (versionRequirement != null) {
for (versionRequirement in versionRequirements) {
sb.appendln(" // $versionRequirement")
}
for (annotation in annotations) {
@@ -536,7 +536,7 @@ class ClassPrinter(private val settings: KotlinpSettings) : KmClassVisitor(), Ab
private var name: ClassName? = null
private val typeParams = mutableListOf<String>()
private val supertypes = mutableListOf<String>()
private var versionRequirement: String? = null
private val versionRequirements = mutableListOf<String>()
private var anonymousObjectOriginName: String? = null
override fun visit(flags: Flags, name: ClassName) {
@@ -548,8 +548,8 @@ class ClassPrinter(private val settings: KotlinpSettings) : KmClassVisitor(), Ab
if (anonymousObjectOriginName != null) {
result.appendln("// anonymous object origin: $anonymousObjectOriginName")
}
if (versionRequirement != null) {
result.appendln(" // $versionRequirement")
for (versionRequirement in versionRequirements) {
result.appendln("// $versionRequirement")
}
result.appendFlags(flags!!, CLASS_FLAGS_MAP)
result.append(name)
@@ -604,7 +604,7 @@ class ClassPrinter(private val settings: KotlinpSettings) : KmClassVisitor(), Ab
}
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
printVersionRequirement { versionRequirement = it }
printVersionRequirement { versionRequirements.add(it) }
override fun visitExtensions(type: KmExtensionType): KmClassExtensionVisitor? {
if (type != JvmClassExtensionVisitor.TYPE) return null
+1 -1
View File
@@ -1,6 +1,6 @@
// test/Klass.class
// ------------------------------------------
// requires API version 1.2.0 (level=WARNING, message="Klass must not be used!")
// requires API version 1.2.0 (level=WARNING, message="Klass must not be used!")
public final class test/Klass : kotlin/Any {
// signature: <init>()V