Preserve 'enforce UTF8' data in proto field types

Bug: 158623350
Change-Id: Id830bba5e72c923789629c5bc30445e6d2be47bb
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldType.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldType.java
index a9cff43..211589a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldType.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldType.java
@@ -22,21 +22,25 @@
 
   private static final int FIELD_ID_MASK = 0xFF;
   private static final int FIELD_IS_REQUIRED_MASK = 0x100;
+  private static final int FIELD_ENFORCE_UTF8_MASK = 0x200;
   private static final int FIELD_NEEDS_IS_INITIALIZED_CHECK_MASK = 0x400;
   private static final int FIELD_IS_MAP_FIELD_WITH_PROTO_2_ENUM_VALUE_MASK = 0x800;
 
   private final int id;
   private final boolean isRequired;
+  private final boolean enforceUtf8Mask;
   private final boolean needsIsInitializedCheck;
   private final boolean isMapFieldWithProto2EnumValue;
 
   ProtoFieldType(
       int id,
       boolean isRequired,
+      boolean enforceUtf8Mask,
       boolean needsIsInitializedCheck,
       boolean isMapFieldWithProto2EnumValue) {
     this.id = id;
     this.isRequired = isRequired;
+    this.enforceUtf8Mask = enforceUtf8Mask;
     this.needsIsInitializedCheck = needsIsInitializedCheck;
     this.isMapFieldWithProto2EnumValue = isMapFieldWithProto2EnumValue;
     assert isValid();
@@ -48,12 +52,14 @@
       return new ProtoFieldType(
           fieldTypeWithExtraBits & FIELD_ID_MASK,
           isBitInMaskSet(fieldTypeWithExtraBits, FIELD_IS_REQUIRED_MASK),
+          isBitInMaskSet(fieldTypeWithExtraBits, FIELD_ENFORCE_UTF8_MASK),
           isBitInMaskSet(fieldTypeWithExtraBits, FIELD_NEEDS_IS_INITIALIZED_CHECK_MASK),
           isBitInMaskSet(fieldTypeWithExtraBits, FIELD_IS_MAP_FIELD_WITH_PROTO_2_ENUM_VALUE_MASK));
     } else {
       return new ProtoOneOfFieldType(
           fieldTypeWithExtraBits & FIELD_ID_MASK,
           isBitInMaskSet(fieldTypeWithExtraBits, FIELD_IS_REQUIRED_MASK),
+          isBitInMaskSet(fieldTypeWithExtraBits, FIELD_ENFORCE_UTF8_MASK),
           isBitInMaskSet(fieldTypeWithExtraBits, FIELD_NEEDS_IS_INITIALIZED_CHECK_MASK),
           isBitInMaskSet(fieldTypeWithExtraBits, FIELD_IS_MAP_FIELD_WITH_PROTO_2_ENUM_VALUE_MASK));
     }
@@ -141,6 +147,9 @@
     if (isRequired) {
       result |= FIELD_IS_REQUIRED_MASK;
     }
+    if (enforceUtf8Mask) {
+      result |= FIELD_ENFORCE_UTF8_MASK;
+    }
     if (needsIsInitializedCheck) {
       result |= FIELD_NEEDS_IS_INITIALIZED_CHECK_MASK;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldTypeFactory.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldTypeFactory.java
index 54000eb..c655ce8 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldTypeFactory.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldTypeFactory.java
@@ -15,6 +15,7 @@
     ProtoFieldType result = fieldTypes.get(fieldTypeIdWithExtraBits);
     if (result == null) {
       result = ProtoFieldType.fromFieldIdWithExtraBits(fieldTypeIdWithExtraBits);
+      assert result.serialize() == fieldTypeIdWithExtraBits;
       fieldTypes.put(fieldTypeIdWithExtraBits, result);
     }
     return result;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoOneOfFieldType.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoOneOfFieldType.java
index c476382..6ddef35 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoOneOfFieldType.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoOneOfFieldType.java
@@ -13,9 +13,10 @@
   ProtoOneOfFieldType(
       int id,
       boolean isRequired,
+      boolean enforceUtf8Mask,
       boolean needsIsInitializedCheck,
       boolean isMapFieldWithProto2EnumValue) {
-    super(id, isRequired, needsIsInitializedCheck, isMapFieldWithProto2EnumValue);
+    super(id, isRequired, enforceUtf8Mask, needsIsInitializedCheck, isMapFieldWithProto2EnumValue);
   }
 
   public ProtoFieldType getActualFieldType(ProtoFieldTypeFactory factory) {
diff --git a/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java b/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java
index f66df29..ddaf85f 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java
@@ -8,7 +8,6 @@
 import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepAllProtosRule;
 import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepDynamicMethodSignatureRule;
 import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepNewMessageInfoSignatureRule;
-import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.TestParameters;
@@ -52,12 +51,6 @@
   }
 
   private void inspect(CodeInspector inspector) throws Exception {
-    try {
-      assertRewrittenProtoSchemasMatch(new CodeInspector(getProgramFiles()), inspector);
-    } catch (AssertionError e) {
-      // TODO(b/158623350): Proto schemas should be identical.
-      return;
-    }
-    fail("Unreachable");
+    assertRewrittenProtoSchemasMatch(new CodeInspector(getProgramFiles()), inspector);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/internal/proto/YouTubeV1508ProtoRewritingTest.java b/src/test/java/com/android/tools/r8/internal/proto/YouTubeV1508ProtoRewritingTest.java
index 8744623..5596fc7 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/YouTubeV1508ProtoRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/YouTubeV1508ProtoRewritingTest.java
@@ -8,7 +8,6 @@
 import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepAllProtosRule;
 import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepDynamicMethodSignatureRule;
 import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepNewMessageInfoSignatureRule;
-import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.TestParameters;
@@ -63,12 +62,6 @@
   }
 
   private void inspect(CodeInspector inspector) throws Exception {
-    try {
-      assertRewrittenProtoSchemasMatch(new CodeInspector(getProgramFiles()), inspector);
-    } catch (AssertionError e) {
-      // TODO(b/158623350): Proto schemas should be identical.
-      return;
-    }
-    fail("Unreachable");
+    assertRewrittenProtoSchemasMatch(new CodeInspector(getProgramFiles()), inspector);
   }
 }