Fix proto comparison for fields mapped to type table

This commit is contained in:
Alexey Tsvetkov
2019-10-28 04:25:18 +03:00
committed by romanart
parent c694752b4f
commit 28e6219b0b
8 changed files with 407 additions and 310 deletions
@@ -119,7 +119,14 @@ class GenerateProtoBufCompare {
p.println("/** This file is generated by org.jetbrains.kotlin.generators.protobuf.GenerateProtoBufCompare. DO NOT MODIFY MANUALLY */")
p.println()
p.println("open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameResolver: NameResolver) {")
p.println("open class ProtoCompareGenerated(")
p.pushIndent()
p.println("val oldNameResolver: NameResolver,")
p.println("val newNameResolver: NameResolver,")
p.println("oldTypeTable: ProtoBuf.TypeTable?,")
p.println("newTypeTable: ProtoBuf.TypeTable?")
p.popIndent()
p.println(") {")
p.pushIndent()
p.println("private val strings = Interner<String>()")
@@ -127,6 +134,8 @@ class GenerateProtoBufCompare {
p.println("val $NEW_PREFIX${STRING_INDEXES_NAME}Map: MutableMap<Int, Int> = hashMapOf()")
p.println("val $OLD_PREFIX${CLASS_ID_INDEXES_NAME}Map: MutableMap<Int, Int> = hashMapOf()")
p.println("val $NEW_PREFIX${CLASS_ID_INDEXES_NAME}Map: MutableMap<Int, Int> = hashMapOf()")
p.println("val oldTypeTable: ProtoBuf.TypeTable = oldTypeTable ?: ProtoBuf.TypeTable.getDefaultInstance()")
p.println("val newTypeTable: ProtoBuf.TypeTable = newTypeTable ?: ProtoBuf.TypeTable.getDefaultInstance()")
p.println()
p.println("private val classIds = Interner<ClassId>()")
@@ -162,6 +171,10 @@ class GenerateProtoBufCompare {
}
fun generateAuxiliaryMethods(p: Printer) {
p.println("fun oldGetTypeById(id: Int): ProtoBuf.Type = oldTypeTable.getType(id) ?: error(\"Unknown type id: ${'$'}id\")")
p.println("fun newGetTypeById(id: Int): ProtoBuf.Type = newTypeTable.getType(id) ?: error(\"Unknown type id: ${'$'}id\")")
p.println()
p.println("fun oldGetIndexOfString(index: Int): Int = getIndexOfString(index, oldStringIndexesMap, oldNameResolver)")
p.println("fun newGetIndexOfString(index: Int): Int = getIndexOfString(index, newStringIndexesMap, newNameResolver)")
p.println()
@@ -206,7 +219,7 @@ class GenerateProtoBufCompare {
val extFields = extensions[descriptor]?.filter { !it.isSkip } ?: emptyList()
p.println()
p.println("fun $typeName.$HASH_CODE_NAME(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) -> Int): Int {")
p.println("fun $typeName.$HASH_CODE_NAME(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) -> Int, typeById: (Int) -> ProtoBuf.Type): Int {")
p.pushIndent()
p.println("var $HASH_CODE_NAME = 1")
@@ -426,6 +439,8 @@ class GenerateProtoBufCompare {
private fun ifWithComparison(field: Descriptors.FieldDescriptor, expr: String, statement: String) =
when {
field.options.getExtension(DebugExtOptionsProtoBuf.typeIdInTable) ->
"if (!$CHECK_EQUALS_NAME(oldTypeTable.getType(old.$expr), newTypeTable.getType(new.$expr))) $statement"
field.options.getExtension(DebugExtOptionsProtoBuf.stringIdInTable) ||
field.options.getExtension(DebugExtOptionsProtoBuf.nameIdInTable) ->
"if (!$CHECK_STRING_EQUALS_NAME(old.$expr, new.$expr)) $statement"
@@ -449,6 +464,8 @@ class GenerateProtoBufCompare {
private fun fieldToHashCode(field: Descriptors.FieldDescriptor, expr: String): String =
when {
field.options.getExtension(DebugExtOptionsProtoBuf.typeIdInTable) ->
"typeById($expr).$HASH_CODE_NAME(stringIndexes, fqNameIndexes, typeById)"
field.options.getExtension(DebugExtOptionsProtoBuf.stringIdInTable) ||
field.options.getExtension(DebugExtOptionsProtoBuf.nameIdInTable) ->
"stringIndexes($expr)"
@@ -459,7 +476,7 @@ class GenerateProtoBufCompare {
field.javaType in JAVA_TYPES_WITH_INLINED_EQUALS ->
"$expr.$HASH_CODE_NAME()"
else ->
"$expr.$HASH_CODE_NAME(stringIndexes, fqNameIndexes)"
"$expr.$HASH_CODE_NAME(stringIndexes, fqNameIndexes, typeById)"
}
private val Descriptors.Descriptor.typeName: String