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
@@ -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