Support multiple version requirements on single element
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user