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
+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(