Mojom compiler: Move RuntimeTypeInfo from mojom_files.mojom to mojom_types.mojom.

Previously it was awkward/impossible for mojom_types.mojom.go to include the functions that implement runtime type discovery because the structs were defined in mojom_files.mojom.go which is in a different package that depends on mojom_types.mojom.go. This was an unfortunate situation because it meant that any other mojom that depended on mojom_types.mojom also could not fully implement runtime type discovery.

BUG=#448
R=azani@chromium.org

Review URL: https://codereview.chromium.org/1717583003 .
diff --git a/mojo/dart/packages/mojo/lib/mojo/bindings/types/mojom_files.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/bindings/types/mojom_files.mojom.dart
index c61cc1c..76cb0db 100644
--- a/mojo/dart/packages/mojo/lib/mojo/bindings/types/mojom_files.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/bindings/types/mojom_files.mojom.dart
@@ -752,305 +752,5 @@
 
 
 
-class ServiceTypeInfo extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(24, 0)
-  ];
-  String topLevelInterface = null;
-  List<String> completeTypeSet = null;
-
-  ServiceTypeInfo() : super(kVersions.last.size);
-
-  static ServiceTypeInfo deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static ServiceTypeInfo decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    ServiceTypeInfo result = new ServiceTypeInfo();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      result.topLevelInterface = decoder0.decodeString(8, false);
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      var decoder1 = decoder0.decodePointer(16, false);
-      {
-        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
-        result.completeTypeSet = new List<String>(si1.numElements);
-        for (int i1 = 0; i1 < si1.numElements; ++i1) {
-          
-          result.completeTypeSet[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
-        }
-      }
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      encoder0.encodeString(topLevelInterface, 8, false);
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "topLevelInterface of struct ServiceTypeInfo: $e";
-      rethrow;
-    }
-    try {
-      if (completeTypeSet == null) {
-        encoder0.encodeNullPointer(16, false);
-      } else {
-        var encoder1 = encoder0.encodePointerArray(completeTypeSet.length, 16, bindings.kUnspecifiedArrayLength);
-        for (int i0 = 0; i0 < completeTypeSet.length; ++i0) {
-          encoder1.encodeString(completeTypeSet[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
-        }
-      }
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "completeTypeSet of struct ServiceTypeInfo: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "ServiceTypeInfo("
-           "topLevelInterface: $topLevelInterface" ", "
-           "completeTypeSet: $completeTypeSet" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["topLevelInterface"] = topLevelInterface;
-    map["completeTypeSet"] = completeTypeSet;
-    return map;
-  }
-}
-
-
-
-
-class RuntimeTypeInfo extends bindings.Struct {
-  static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(24, 0)
-  ];
-  Map<String, ServiceTypeInfo> servicesByName = null;
-  Map<String, mojom_types_mojom.UserDefinedType> typeMap = null;
-
-  RuntimeTypeInfo() : super(kVersions.last.size);
-
-  static RuntimeTypeInfo deserialize(bindings.Message message) {
-    var decoder = new bindings.Decoder(message);
-    var result = decode(decoder);
-    if (decoder.excessHandles != null) {
-      decoder.excessHandles.forEach((h) => h.close());
-    }
-    return result;
-  }
-
-  static RuntimeTypeInfo decode(bindings.Decoder decoder0) {
-    if (decoder0 == null) {
-      return null;
-    }
-    RuntimeTypeInfo result = new RuntimeTypeInfo();
-
-    var mainDataHeader = decoder0.decodeStructDataHeader();
-    if (mainDataHeader.version <= kVersions.last.version) {
-      // Scan in reverse order to optimize for more recent versions.
-      for (int i = kVersions.length - 1; i >= 0; --i) {
-        if (mainDataHeader.version >= kVersions[i].version) {
-          if (mainDataHeader.size == kVersions[i].size) {
-            // Found a match.
-            break;
-          }
-          throw new bindings.MojoCodecError(
-              'Header size doesn\'t correspond to known version size.');
-        }
-      }
-    } else if (mainDataHeader.size < kVersions.last.size) {
-      throw new bindings.MojoCodecError(
-        'Message newer than the last known version cannot be shorter than '
-        'required by the last known version.');
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      var decoder1 = decoder0.decodePointer(8, false);
-      {
-        decoder1.decodeDataHeaderForMap();
-        List<String> keys0;
-        List<ServiceTypeInfo> values0;
-        {
-          
-          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize, false);
-          {
-            var si2 = decoder2.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
-            keys0 = new List<String>(si2.numElements);
-            for (int i2 = 0; i2 < si2.numElements; ++i2) {
-              
-              keys0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
-            }
-          }
-        }
-        {
-          
-          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, false);
-          {
-            var si2 = decoder2.decodeDataHeaderForPointerArray(keys0.length);
-            values0 = new List<ServiceTypeInfo>(si2.numElements);
-            for (int i2 = 0; i2 < si2.numElements; ++i2) {
-              
-              var decoder3 = decoder2.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
-              values0[i2] = ServiceTypeInfo.decode(decoder3);
-            }
-          }
-        }
-        result.servicesByName = new Map<String, ServiceTypeInfo>.fromIterables(
-            keys0, values0);
-      }
-    }
-    if (mainDataHeader.version >= 0) {
-      
-      var decoder1 = decoder0.decodePointer(16, false);
-      {
-        decoder1.decodeDataHeaderForMap();
-        List<String> keys0;
-        List<mojom_types_mojom.UserDefinedType> values0;
-        {
-          
-          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize, false);
-          {
-            var si2 = decoder2.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
-            keys0 = new List<String>(si2.numElements);
-            for (int i2 = 0; i2 < si2.numElements; ++i2) {
-              
-              keys0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
-            }
-          }
-        }
-        {
-          
-          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, false);
-          {
-            var si2 = decoder2.decodeDataHeaderForUnionArray(keys0.length);
-            values0 = new List<mojom_types_mojom.UserDefinedType>(si2.numElements);
-            for (int i2 = 0; i2 < si2.numElements; ++i2) {
-              
-                values0[i2] = mojom_types_mojom.UserDefinedType.decode(decoder2, bindings.ArrayDataHeader.kHeaderSize + bindings.kUnionSize * i2);
-                if (values0[i2] == null) {
-                  throw new bindings.MojoCodecError(
-                    'Trying to decode null union for non-nullable mojom_types_mojom.UserDefinedType.');
-                }
-            }
-          }
-        }
-        result.typeMap = new Map<String, mojom_types_mojom.UserDefinedType>.fromIterables(
-            keys0, values0);
-      }
-    }
-    return result;
-  }
-
-  void encode(bindings.Encoder encoder) {
-    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
-    try {
-      if (servicesByName == null) {
-        encoder0.encodeNullPointer(8, false);
-      } else {
-        var encoder1 = encoder0.encoderForMap(8);
-        int size0 = servicesByName.length;
-        var keys0 = servicesByName.keys.toList();
-        var values0 = servicesByName.values.toList();
-        
-        {
-          var encoder2 = encoder1.encodePointerArray(keys0.length, bindings.ArrayDataHeader.kHeaderSize, bindings.kUnspecifiedArrayLength);
-          for (int i1 = 0; i1 < keys0.length; ++i1) {
-            encoder2.encodeString(keys0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
-          }
-        }
-        
-        {
-          var encoder2 = encoder1.encodePointerArray(values0.length, bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, bindings.kUnspecifiedArrayLength);
-          for (int i1 = 0; i1 < values0.length; ++i1) {
-            encoder2.encodeStruct(values0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
-          }
-        }
-      }
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "servicesByName of struct RuntimeTypeInfo: $e";
-      rethrow;
-    }
-    try {
-      if (typeMap == null) {
-        encoder0.encodeNullPointer(16, false);
-      } else {
-        var encoder1 = encoder0.encoderForMap(16);
-        int size0 = typeMap.length;
-        var keys0 = typeMap.keys.toList();
-        var values0 = typeMap.values.toList();
-        
-        {
-          var encoder2 = encoder1.encodePointerArray(keys0.length, bindings.ArrayDataHeader.kHeaderSize, bindings.kUnspecifiedArrayLength);
-          for (int i1 = 0; i1 < keys0.length; ++i1) {
-            encoder2.encodeString(keys0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
-          }
-        }
-        
-        {
-          var encoder2 = encoder1.encodeUnionArray(values0.length, bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, bindings.kUnspecifiedArrayLength);
-          for (int i1 = 0; i1 < values0.length; ++i1) {
-            encoder2.encodeUnion(values0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kUnionSize * i1, false);
-          }
-        }
-      }
-    } on bindings.MojoCodecError catch(e) {
-      e.message = "Error encountered while encoding field "
-          "typeMap of struct RuntimeTypeInfo: $e";
-      rethrow;
-    }
-  }
-
-  String toString() {
-    return "RuntimeTypeInfo("
-           "servicesByName: $servicesByName" ", "
-           "typeMap: $typeMap" ")";
-  }
-
-  Map toJson() {
-    Map map = new Map();
-    map["servicesByName"] = servicesByName;
-    map["typeMap"] = typeMap;
-    return map;
-  }
-}
-
-
-
-
 
 
diff --git a/mojo/dart/packages/mojo/lib/mojo/bindings/types/mojom_types.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/bindings/types/mojom_types.mojom.dart
index a97fa51..b97d8bd 100644
--- a/mojo/dart/packages/mojo/lib/mojo/bindings/types/mojom_types.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/bindings/types/mojom_types.mojom.dart
@@ -2635,6 +2635,306 @@
 
 
 
+class ServiceTypeInfo extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  String topLevelInterface = null;
+  List<String> completeTypeSet = null;
+
+  ServiceTypeInfo() : super(kVersions.last.size);
+
+  static ServiceTypeInfo deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static ServiceTypeInfo decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    ServiceTypeInfo result = new ServiceTypeInfo();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.topLevelInterface = decoder0.decodeString(8, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.completeTypeSet = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.completeTypeSet[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    try {
+      encoder0.encodeString(topLevelInterface, 8, false);
+    } on bindings.MojoCodecError catch(e) {
+      e.message = "Error encountered while encoding field "
+          "topLevelInterface of struct ServiceTypeInfo: $e";
+      rethrow;
+    }
+    try {
+      if (completeTypeSet == null) {
+        encoder0.encodeNullPointer(16, false);
+      } else {
+        var encoder1 = encoder0.encodePointerArray(completeTypeSet.length, 16, bindings.kUnspecifiedArrayLength);
+        for (int i0 = 0; i0 < completeTypeSet.length; ++i0) {
+          encoder1.encodeString(completeTypeSet[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+        }
+      }
+    } on bindings.MojoCodecError catch(e) {
+      e.message = "Error encountered while encoding field "
+          "completeTypeSet of struct ServiceTypeInfo: $e";
+      rethrow;
+    }
+  }
+
+  String toString() {
+    return "ServiceTypeInfo("
+           "topLevelInterface: $topLevelInterface" ", "
+           "completeTypeSet: $completeTypeSet" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["topLevelInterface"] = topLevelInterface;
+    map["completeTypeSet"] = completeTypeSet;
+    return map;
+  }
+}
+
+
+
+
+class RuntimeTypeInfo extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Map<String, ServiceTypeInfo> servicesByName = null;
+  Map<String, UserDefinedType> typeMap = null;
+
+  RuntimeTypeInfo() : super(kVersions.last.size);
+
+  static RuntimeTypeInfo deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    if (decoder.excessHandles != null) {
+      decoder.excessHandles.forEach((h) => h.close());
+    }
+    return result;
+  }
+
+  static RuntimeTypeInfo decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    RuntimeTypeInfo result = new RuntimeTypeInfo();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      {
+        decoder1.decodeDataHeaderForMap();
+        List<String> keys0;
+        List<ServiceTypeInfo> values0;
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+            keys0 = new List<String>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              keys0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
+            }
+          }
+        }
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(keys0.length);
+            values0 = new List<ServiceTypeInfo>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              var decoder3 = decoder2.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
+              values0[i2] = ServiceTypeInfo.decode(decoder3);
+            }
+          }
+        }
+        result.servicesByName = new Map<String, ServiceTypeInfo>.fromIterables(
+            keys0, values0);
+      }
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      {
+        decoder1.decodeDataHeaderForMap();
+        List<String> keys0;
+        List<UserDefinedType> values0;
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+            keys0 = new List<String>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+              keys0[i2] = decoder2.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i2, false);
+            }
+          }
+        }
+        {
+          
+          var decoder2 = decoder1.decodePointer(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, false);
+          {
+            var si2 = decoder2.decodeDataHeaderForUnionArray(keys0.length);
+            values0 = new List<UserDefinedType>(si2.numElements);
+            for (int i2 = 0; i2 < si2.numElements; ++i2) {
+              
+                values0[i2] = UserDefinedType.decode(decoder2, bindings.ArrayDataHeader.kHeaderSize + bindings.kUnionSize * i2);
+                if (values0[i2] == null) {
+                  throw new bindings.MojoCodecError(
+                    'Trying to decode null union for non-nullable UserDefinedType.');
+                }
+            }
+          }
+        }
+        result.typeMap = new Map<String, UserDefinedType>.fromIterables(
+            keys0, values0);
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    try {
+      if (servicesByName == null) {
+        encoder0.encodeNullPointer(8, false);
+      } else {
+        var encoder1 = encoder0.encoderForMap(8);
+        int size0 = servicesByName.length;
+        var keys0 = servicesByName.keys.toList();
+        var values0 = servicesByName.values.toList();
+        
+        {
+          var encoder2 = encoder1.encodePointerArray(keys0.length, bindings.ArrayDataHeader.kHeaderSize, bindings.kUnspecifiedArrayLength);
+          for (int i1 = 0; i1 < keys0.length; ++i1) {
+            encoder2.encodeString(keys0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          }
+        }
+        
+        {
+          var encoder2 = encoder1.encodePointerArray(values0.length, bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, bindings.kUnspecifiedArrayLength);
+          for (int i1 = 0; i1 < values0.length; ++i1) {
+            encoder2.encodeStruct(values0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          }
+        }
+      }
+    } on bindings.MojoCodecError catch(e) {
+      e.message = "Error encountered while encoding field "
+          "servicesByName of struct RuntimeTypeInfo: $e";
+      rethrow;
+    }
+    try {
+      if (typeMap == null) {
+        encoder0.encodeNullPointer(16, false);
+      } else {
+        var encoder1 = encoder0.encoderForMap(16);
+        int size0 = typeMap.length;
+        var keys0 = typeMap.keys.toList();
+        var values0 = typeMap.values.toList();
+        
+        {
+          var encoder2 = encoder1.encodePointerArray(keys0.length, bindings.ArrayDataHeader.kHeaderSize, bindings.kUnspecifiedArrayLength);
+          for (int i1 = 0; i1 < keys0.length; ++i1) {
+            encoder2.encodeString(keys0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+          }
+        }
+        
+        {
+          var encoder2 = encoder1.encodeUnionArray(values0.length, bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize, bindings.kUnspecifiedArrayLength);
+          for (int i1 = 0; i1 < values0.length; ++i1) {
+            encoder2.encodeUnion(values0[i1], bindings.ArrayDataHeader.kHeaderSize + bindings.kUnionSize * i1, false);
+          }
+        }
+      }
+    } on bindings.MojoCodecError catch(e) {
+      e.message = "Error encountered while encoding field "
+          "typeMap of struct RuntimeTypeInfo: $e";
+      rethrow;
+    }
+  }
+
+  String toString() {
+    return "RuntimeTypeInfo("
+           "servicesByName: $servicesByName" ", "
+           "typeMap: $typeMap" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["servicesByName"] = servicesByName;
+    map["typeMap"] = typeMap;
+    return map;
+  }
+}
+
+
+
+
 
 enum TypeTag {
   simpleType,
diff --git a/mojo/public/interfaces/bindings/mojom_files.mojom b/mojo/public/interfaces/bindings/mojom_files.mojom
index 0acc83f..603e3e8 100644
--- a/mojo/public/interfaces/bindings/mojom_files.mojom
+++ b/mojo/public/interfaces/bindings/mojom_files.mojom
@@ -102,56 +102,4 @@
   // All the constant_keys known to the owning MojomFileGraph.
   array<string>? top_level_constants;
   array<string>? embedded_constants;
-};
-
-// This structure is a component of RuntimeTypeInfo.
-// It contains the information necessary to extract the types corresponding
-// to a single service. See the comments on RuntimeTypeInfo for a fuller
-// explanation.
-struct ServiceTypeInfo {
-  // The type_key of the top-level interface for the service. This is the
-  // type_key of the interface that was annotated with the "ServiceName"
-  // annotation.
-  string top_level_interface;
-
-  // All of the type_keys of the types in the complete type set of the serive.
-  // Note that this set is not restricted to the types from a single .mojom
-  // file.
-  array<string> complete_type_set;
-};
-
-// This structure contains the information necessary for an implementation of
-// |ServiceDescription| (see service_describer.mojom), but restricted to a
-// single .mojom file and not restricted to a single service. At runtime an
-// implementation of |ServiceDescription| needs to merge the |RuntimeTypeInfo|
-// from all of the generated modules in the file graph and then filter on only
-// those types in the complete type set of a single service.
-//
-// Note that this structure is not literally a component of a MojomFileGraph.
-// Instead, at compile time an instance of this structure is created and
-// serialized to an array of bytes that is stored in the
-// |serialized_runtime_type_info| field of each |MojomFile|. Then at code
-// generation time this array of bytes is written into the generated source
-// code as a literal array of bytes. Then at runtime this array of bytes
-// is deserialized into an instance of RuntimeTypeInfo that may be used by
-// an implementation of |ServiceDescription|.
-struct RuntimeTypeInfo {
-  // All of the services contained in a single .mojom file. A "service" is an
-  // interface that has been annoted with the "ServiceName" annotation.
-  // This indicates that it can be returned from
-  // ServiceProvider.ProvideService() and its description can be returned
-  // from ServiceDescriber.DescribeService(). The keys are the service names
-  // (as specified in the "ServiceName" annotation) and the values are instances
-  // of |ServiceTypeInfo| for that service.
-  //
-  // Note that the |type_map| field below is scoped to a single .mojom file and
-  // so some of the keys in the |complete_type_set| field of each
-  // |ServiceTypeInfo| struct may not occur in |type_map|. At runtime the
-  // |type_map|s from multiple files may need to be combined in order to
-  // get all of the types listed in the |complete_type_set| of a single service.
-  map<string, ServiceTypeInfo> services_by_name;
-
-  // All of the resolved user-defined-types contained in a single .mojom File.
-  // The keys are the |type_key|s.
-  map<string, UserDefinedType> type_map;
-};
+};
\ No newline at end of file
diff --git a/mojo/public/interfaces/bindings/mojom_types.mojom b/mojo/public/interfaces/bindings/mojom_types.mojom
index c036559..bd29dbc 100644
--- a/mojo/public/interfaces/bindings/mojom_types.mojom
+++ b/mojo/public/interfaces/bindings/mojom_types.mojom
@@ -447,3 +447,58 @@
   // The the constant keys of constants declared in this namespace.
   array<string>? constants;
 };
+
+///////////////// Runtime Type Information //////////////////////
+
+// This structure is a component of RuntimeTypeInfo.
+// It contains the information necessary to extract the types corresponding
+// to a single service. See the comments on RuntimeTypeInfo for a fuller
+// explanation.
+struct ServiceTypeInfo {
+  // The type_key of the top-level interface for the service. This is the
+  // type_key of the interface that was annotated with the "ServiceName"
+  // annotation.
+  string top_level_interface;
+
+  // All of the type_keys of the types in the complete type set of the serive.
+  // Note that this set is not restricted to the types from a single .mojom
+  // file.
+  array<string> complete_type_set;
+};
+
+// This structure contains the information necessary for an implementation of
+// |ServiceDescription| (see service_describer.mojom), but restricted to a
+// single .mojom file and not restricted to a single service. At runtime an
+// implementation of |ServiceDescription| needs to merge the |RuntimeTypeInfo|
+// from all of the generated modules in the file graph and then filter on only
+// those types in the complete type set of a single service.
+//
+// Note that this structure is not literally a component of a MojomFileGraph.
+// Instead, at compile time an instance of this structure is created and
+// serialized to an array of bytes that is stored in the
+// |serialized_runtime_type_info| field of each |MojomFile|. Then at code
+// generation time this array of bytes is written into the generated source
+// code as a literal array of bytes. Then at runtime this array of bytes
+// is deserialized into an instance of RuntimeTypeInfo that may be used by
+// an implementation of |ServiceDescription|.
+struct RuntimeTypeInfo {
+  // All of the services contained in a single .mojom file. A "service" is an
+  // interface that has been annoted with the "ServiceName" annotation.
+  // This indicates that it can be returned from
+  // ServiceProvider.ProvideService() and its description can be returned
+  // from ServiceDescriber.DescribeService(). The keys are the service names
+  // (as specified in the "ServiceName" annotation) and the values are instances
+  // of |ServiceTypeInfo| for that service.
+  //
+  // Note that the |type_map| field below is scoped to a single .mojom file and
+  // so some of the keys in the |complete_type_set| field of each
+  // |ServiceTypeInfo| struct may not occur in |type_map|. At runtime the
+  // |type_map|s from multiple files may need to be combined in order to
+  // get all of the types listed in the |complete_type_set| of a single service.
+  map<string, ServiceTypeInfo> services_by_name;
+
+  // All of the resolved user-defined-types contained in a single .mojom File.
+  // The keys are the |type_key|s.
+  map<string, UserDefinedType> type_map;
+};
+
diff --git a/mojo/public/tools/bindings/mojom_parser/bin/linux64/mojom_parser.sha1 b/mojo/public/tools/bindings/mojom_parser/bin/linux64/mojom_parser.sha1
index 9fc06f9..a35b398 100644
--- a/mojo/public/tools/bindings/mojom_parser/bin/linux64/mojom_parser.sha1
+++ b/mojo/public/tools/bindings/mojom_parser/bin/linux64/mojom_parser.sha1
@@ -1 +1 @@
-63b5ed7da139aa02d5443abe846542dd81495aae
\ No newline at end of file
+b7d4b17fa6a4c0dc32f156f3ce2386eeef92bbc8
\ No newline at end of file
diff --git a/mojo/public/tools/bindings/mojom_parser/bin/mac64/mojom_parser.sha1 b/mojo/public/tools/bindings/mojom_parser/bin/mac64/mojom_parser.sha1
index 7a4e62c..0cc7071 100644
--- a/mojo/public/tools/bindings/mojom_parser/bin/mac64/mojom_parser.sha1
+++ b/mojo/public/tools/bindings/mojom_parser/bin/mac64/mojom_parser.sha1
@@ -1 +1 @@
-e5778703000caf9afb9b6d7edd02b160a27ad8b9
\ No newline at end of file
+aa5c886c2fe50c2f040fb605895e113e64c49aa0
\ No newline at end of file
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generated/mojom_files_mojom.py b/mojo/public/tools/bindings/pylib/mojom/generate/generated/mojom_files_mojom.py
index 5c6430a..7b59868 100644
--- a/mojo/public/tools/bindings/pylib/mojom/generate/generated/mojom_files_mojom.py
+++ b/mojo/public/tools/bindings/pylib/mojom/generate/generated/mojom_files_mojom.py
@@ -45,21 +45,3 @@
     ],
   }
 
-class ServiceTypeInfo(object):
-  __metaclass__ = _reflection.MojoStructType
-  DESCRIPTOR = {
-    'fields': [
-      _descriptor.SingleFieldGroup('top_level_interface', _descriptor.TYPE_STRING, 0, 0),
-      _descriptor.SingleFieldGroup('complete_type_set', _descriptor.GenericArrayType(_descriptor.TYPE_STRING), 1, 0),
-    ],
-  }
-
-class RuntimeTypeInfo(object):
-  __metaclass__ = _reflection.MojoStructType
-  DESCRIPTOR = {
-    'fields': [
-      _descriptor.SingleFieldGroup('services_by_name', _descriptor.MapType(_descriptor.TYPE_STRING, _descriptor.StructType(lambda: ServiceTypeInfo)), 0, 0),
-      _descriptor.SingleFieldGroup('type_map', _descriptor.MapType(_descriptor.TYPE_STRING, _descriptor.UnionType(lambda: mojom_types_mojom.UserDefinedType)), 1, 0),
-    ],
-  }
-
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generated/mojom_types_mojom.py b/mojo/public/tools/bindings/pylib/mojom/generate/generated/mojom_types_mojom.py
index 12a25ac..9fabfc3 100644
--- a/mojo/public/tools/bindings/pylib/mojom/generate/generated/mojom_types_mojom.py
+++ b/mojo/public/tools/bindings/pylib/mojom/generate/generated/mojom_types_mojom.py
@@ -248,6 +248,24 @@
     ],
   }
 
+class ServiceTypeInfo(object):
+  __metaclass__ = _reflection.MojoStructType
+  DESCRIPTOR = {
+    'fields': [
+      _descriptor.SingleFieldGroup('top_level_interface', _descriptor.TYPE_STRING, 0, 0),
+      _descriptor.SingleFieldGroup('complete_type_set', _descriptor.GenericArrayType(_descriptor.TYPE_STRING), 1, 0),
+    ],
+  }
+
+class RuntimeTypeInfo(object):
+  __metaclass__ = _reflection.MojoStructType
+  DESCRIPTOR = {
+    'fields': [
+      _descriptor.SingleFieldGroup('services_by_name', _descriptor.MapType(_descriptor.TYPE_STRING, _descriptor.StructType(lambda: ServiceTypeInfo)), 0, 0),
+      _descriptor.SingleFieldGroup('type_map', _descriptor.MapType(_descriptor.TYPE_STRING, _descriptor.UnionType(lambda: UserDefinedType)), 1, 0),
+    ],
+  }
+
 class Type(object):
   __metaclass__ = _reflection.MojoUnionType
   DESCRIPTOR = {
diff --git a/mojom/mojom_parser/generated/mojom_files/mojom_files.mojom.go b/mojom/mojom_parser/generated/mojom_files/mojom_files.mojom.go
index a8f3824..62b9b36 100644
--- a/mojom/mojom_parser/generated/mojom_files/mojom_files.mojom.go
+++ b/mojom/mojom_parser/generated/mojom_files/mojom_files.mojom.go
@@ -1170,429 +1170,3 @@
 	}
 	return nil
 }
-
-type ServiceTypeInfo struct {
-	TopLevelInterface string
-	CompleteTypeSet   []string
-}
-
-func (s *ServiceTypeInfo) Encode(encoder *bindings.Encoder) error {
-	encoder.StartStruct(16, 0)
-	if err := encoder.WritePointer(); err != nil {
-		return err
-	}
-	if err := encoder.WriteString(s.TopLevelInterface); err != nil {
-		return err
-	}
-	if err := encoder.WritePointer(); err != nil {
-		return err
-	}
-	encoder.StartArray(uint32(len(s.CompleteTypeSet)), 64)
-	for _, elem0 := range s.CompleteTypeSet {
-		if err := encoder.WritePointer(); err != nil {
-			return err
-		}
-		if err := encoder.WriteString(elem0); err != nil {
-			return err
-		}
-	}
-	if err := encoder.Finish(); err != nil {
-		return err
-	}
-	if err := encoder.Finish(); err != nil {
-		return err
-	}
-	return nil
-}
-
-var serviceTypeInfo_Versions []bindings.DataHeader = []bindings.DataHeader{
-	bindings.DataHeader{24, 0},
-}
-
-func (s *ServiceTypeInfo) Decode(decoder *bindings.Decoder) error {
-	header, err := decoder.StartStruct()
-	if err != nil {
-		return err
-	}
-	index := sort.Search(len(serviceTypeInfo_Versions), func(i int) bool {
-		return serviceTypeInfo_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
-	})
-	if index < len(serviceTypeInfo_Versions) {
-		if serviceTypeInfo_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
-			index--
-		}
-		expectedSize := serviceTypeInfo_Versions[index].Size
-		if expectedSize != header.Size {
-			return &bindings.ValidationError{bindings.UnexpectedStructHeader,
-				fmt.Sprintf("invalid struct header size: should be %d, but was %d", expectedSize, header.Size),
-			}
-		}
-	}
-	if header.ElementsOrVersion >= 0 {
-		pointer0, err := decoder.ReadPointer()
-		if err != nil {
-			return err
-		}
-		if pointer0 == 0 {
-			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-		} else {
-			value0, err := decoder.ReadString()
-			if err != nil {
-				return err
-			}
-			s.TopLevelInterface = value0
-		}
-	}
-	if header.ElementsOrVersion >= 0 {
-		pointer0, err := decoder.ReadPointer()
-		if err != nil {
-			return err
-		}
-		if pointer0 == 0 {
-			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-		} else {
-			len0, err := decoder.StartArray(64)
-			if err != nil {
-				return err
-			}
-			s.CompleteTypeSet = make([]string, len0)
-			for i0 := uint32(0); i0 < len0; i0++ {
-				pointer1, err := decoder.ReadPointer()
-				if err != nil {
-					return err
-				}
-				if pointer1 == 0 {
-					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-				} else {
-					value1, err := decoder.ReadString()
-					if err != nil {
-						return err
-					}
-					s.CompleteTypeSet[i0] = value1
-				}
-			}
-			if err := decoder.Finish(); err != nil {
-				return err
-			}
-		}
-	}
-	if err := decoder.Finish(); err != nil {
-		return err
-	}
-	return nil
-}
-
-type RuntimeTypeInfo struct {
-	ServicesByName map[string]ServiceTypeInfo
-	TypeMap        map[string]mojom_types.UserDefinedType
-}
-
-func (s *RuntimeTypeInfo) Encode(encoder *bindings.Encoder) error {
-	encoder.StartStruct(16, 0)
-	if err := encoder.WritePointer(); err != nil {
-		return err
-	}
-	encoder.StartMap()
-	{
-		var keys0 []string
-		var values0 []ServiceTypeInfo
-		for key0, value0 := range s.ServicesByName {
-			keys0 = append(keys0, key0)
-			values0 = append(values0, value0)
-		}
-		if err := encoder.WritePointer(); err != nil {
-			return err
-		}
-		encoder.StartArray(uint32(len(keys0)), 64)
-		for _, elem1 := range keys0 {
-			if err := encoder.WritePointer(); err != nil {
-				return err
-			}
-			if err := encoder.WriteString(elem1); err != nil {
-				return err
-			}
-		}
-		if err := encoder.Finish(); err != nil {
-			return err
-		}
-		if err := encoder.WritePointer(); err != nil {
-			return err
-		}
-		encoder.StartArray(uint32(len(values0)), 64)
-		for _, elem1 := range values0 {
-			if err := encoder.WritePointer(); err != nil {
-				return err
-			}
-			if err := elem1.Encode(encoder); err != nil {
-				return err
-			}
-		}
-		if err := encoder.Finish(); err != nil {
-			return err
-		}
-	}
-	if err := encoder.Finish(); err != nil {
-		return err
-	}
-	if err := encoder.WritePointer(); err != nil {
-		return err
-	}
-	encoder.StartMap()
-	{
-		var keys0 []string
-		var values0 []mojom_types.UserDefinedType
-		for key0, value0 := range s.TypeMap {
-			keys0 = append(keys0, key0)
-			values0 = append(values0, value0)
-		}
-		if err := encoder.WritePointer(); err != nil {
-			return err
-		}
-		encoder.StartArray(uint32(len(keys0)), 64)
-		for _, elem1 := range keys0 {
-			if err := encoder.WritePointer(); err != nil {
-				return err
-			}
-			if err := encoder.WriteString(elem1); err != nil {
-				return err
-			}
-		}
-		if err := encoder.Finish(); err != nil {
-			return err
-		}
-		if err := encoder.WritePointer(); err != nil {
-			return err
-		}
-		encoder.StartArray(uint32(len(values0)), 128)
-		for _, elem1 := range values0 {
-			if elem1 == nil {
-				return &bindings.ValidationError{bindings.UnexpectedNullUnion, "unexpected null union"}
-			}
-			if err := elem1.Encode(encoder); err != nil {
-				return err
-			}
-		}
-		if err := encoder.Finish(); err != nil {
-			return err
-		}
-	}
-	if err := encoder.Finish(); err != nil {
-		return err
-	}
-	if err := encoder.Finish(); err != nil {
-		return err
-	}
-	return nil
-}
-
-var runtimeTypeInfo_Versions []bindings.DataHeader = []bindings.DataHeader{
-	bindings.DataHeader{24, 0},
-}
-
-func (s *RuntimeTypeInfo) Decode(decoder *bindings.Decoder) error {
-	header, err := decoder.StartStruct()
-	if err != nil {
-		return err
-	}
-	index := sort.Search(len(runtimeTypeInfo_Versions), func(i int) bool {
-		return runtimeTypeInfo_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
-	})
-	if index < len(runtimeTypeInfo_Versions) {
-		if runtimeTypeInfo_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
-			index--
-		}
-		expectedSize := runtimeTypeInfo_Versions[index].Size
-		if expectedSize != header.Size {
-			return &bindings.ValidationError{bindings.UnexpectedStructHeader,
-				fmt.Sprintf("invalid struct header size: should be %d, but was %d", expectedSize, header.Size),
-			}
-		}
-	}
-	if header.ElementsOrVersion >= 0 {
-		pointer0, err := decoder.ReadPointer()
-		if err != nil {
-			return err
-		}
-		if pointer0 == 0 {
-			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-		} else {
-			if err := decoder.StartMap(); err != nil {
-				return err
-			}
-			var keys0 []string
-			{
-				pointer1, err := decoder.ReadPointer()
-				if err != nil {
-					return err
-				}
-				if pointer1 == 0 {
-					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-				} else {
-					len1, err := decoder.StartArray(64)
-					if err != nil {
-						return err
-					}
-					keys0 = make([]string, len1)
-					for i1 := uint32(0); i1 < len1; i1++ {
-						pointer2, err := decoder.ReadPointer()
-						if err != nil {
-							return err
-						}
-						if pointer2 == 0 {
-							return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-						} else {
-							value2, err := decoder.ReadString()
-							if err != nil {
-								return err
-							}
-							keys0[i1] = value2
-						}
-					}
-					if err := decoder.Finish(); err != nil {
-						return err
-					}
-				}
-			}
-			var values0 []ServiceTypeInfo
-			{
-				pointer1, err := decoder.ReadPointer()
-				if err != nil {
-					return err
-				}
-				if pointer1 == 0 {
-					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-				} else {
-					len1, err := decoder.StartArray(64)
-					if err != nil {
-						return err
-					}
-					values0 = make([]ServiceTypeInfo, len1)
-					for i1 := uint32(0); i1 < len1; i1++ {
-						pointer2, err := decoder.ReadPointer()
-						if err != nil {
-							return err
-						}
-						if pointer2 == 0 {
-							return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-						} else {
-							if err := values0[i1].Decode(decoder); err != nil {
-								return err
-							}
-						}
-					}
-					if err := decoder.Finish(); err != nil {
-						return err
-					}
-				}
-			}
-			if len(keys0) != len(values0) {
-				return &bindings.ValidationError{bindings.DifferentSizedArraysInMap,
-					fmt.Sprintf("Number of keys %d is different from number of values %d", len(keys0), len(values0)),
-				}
-			}
-			if err := decoder.Finish(); err != nil {
-				return err
-			}
-			len0 := len(keys0)
-			map0 := make(map[string]ServiceTypeInfo)
-			for i0 := 0; i0 < len0; i0++ {
-				map0[keys0[i0]] = values0[i0]
-			}
-			s.ServicesByName = map0
-		}
-	}
-	if header.ElementsOrVersion >= 0 {
-		pointer0, err := decoder.ReadPointer()
-		if err != nil {
-			return err
-		}
-		if pointer0 == 0 {
-			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-		} else {
-			if err := decoder.StartMap(); err != nil {
-				return err
-			}
-			var keys0 []string
-			{
-				pointer1, err := decoder.ReadPointer()
-				if err != nil {
-					return err
-				}
-				if pointer1 == 0 {
-					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-				} else {
-					len1, err := decoder.StartArray(64)
-					if err != nil {
-						return err
-					}
-					keys0 = make([]string, len1)
-					for i1 := uint32(0); i1 < len1; i1++ {
-						pointer2, err := decoder.ReadPointer()
-						if err != nil {
-							return err
-						}
-						if pointer2 == 0 {
-							return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-						} else {
-							value2, err := decoder.ReadString()
-							if err != nil {
-								return err
-							}
-							keys0[i1] = value2
-						}
-					}
-					if err := decoder.Finish(); err != nil {
-						return err
-					}
-				}
-			}
-			var values0 []mojom_types.UserDefinedType
-			{
-				pointer1, err := decoder.ReadPointer()
-				if err != nil {
-					return err
-				}
-				if pointer1 == 0 {
-					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-				} else {
-					len1, err := decoder.StartArray(128)
-					if err != nil {
-						return err
-					}
-					values0 = make([]mojom_types.UserDefinedType, len1)
-					for i1 := uint32(0); i1 < len1; i1++ {
-						var err error
-						values0[i1], err = mojom_types.DecodeUserDefinedType(decoder)
-						if err != nil {
-							return err
-						}
-						if values0[i1] == nil {
-							return &bindings.ValidationError{bindings.UnexpectedNullUnion, "unexpected null union"}
-						}
-					}
-					if err := decoder.Finish(); err != nil {
-						return err
-					}
-				}
-			}
-			if len(keys0) != len(values0) {
-				return &bindings.ValidationError{bindings.DifferentSizedArraysInMap,
-					fmt.Sprintf("Number of keys %d is different from number of values %d", len(keys0), len(values0)),
-				}
-			}
-			if err := decoder.Finish(); err != nil {
-				return err
-			}
-			len0 := len(keys0)
-			map0 := make(map[string]mojom_types.UserDefinedType)
-			for i0 := 0; i0 < len0; i0++ {
-				map0[keys0[i0]] = values0[i0]
-			}
-			s.TypeMap = map0
-		}
-	}
-	if err := decoder.Finish(); err != nil {
-		return err
-	}
-	return nil
-}
diff --git a/mojom/mojom_parser/generated/mojom_types/mojom_types.mojom.go b/mojom/mojom_parser/generated/mojom_types/mojom_types.mojom.go
index 07409a3..149f3a1 100644
--- a/mojom/mojom_parser/generated/mojom_types/mojom_types.mojom.go
+++ b/mojom/mojom_parser/generated/mojom_types/mojom_types.mojom.go
@@ -2416,6 +2416,436 @@
 
 
 
+type ServiceTypeInfo struct {
+	TopLevelInterface string
+	CompleteTypeSet []string
+}
+
+func (s *ServiceTypeInfo) Encode(encoder *bindings.Encoder) error {
+	encoder.StartStruct(16, 0)
+	if err := encoder.WritePointer(); err != nil {
+		return err
+	}
+	if err := encoder.WriteString(s.TopLevelInterface); err != nil {
+		return err
+	}
+	if err := encoder.WritePointer(); err != nil {
+		return err
+	}
+	encoder.StartArray(uint32(len(s.CompleteTypeSet)), 64)
+	for _, elem0 := range s.CompleteTypeSet {
+		if err := encoder.WritePointer(); err != nil {
+			return err
+		}
+		if err := encoder.WriteString(elem0); err != nil {
+			return err
+		}
+	}
+	if err := encoder.Finish(); err != nil {
+		return err
+	}
+	if err := encoder.Finish(); err != nil {
+		return err
+	}
+	return nil
+}
+
+var serviceTypeInfo_Versions []bindings.DataHeader = []bindings.DataHeader{
+	bindings.DataHeader{24, 0},
+}
+
+func (s *ServiceTypeInfo) Decode(decoder *bindings.Decoder) error {
+	header, err := decoder.StartStruct()
+	if err != nil {
+		return err
+	}
+	index := sort.Search(len(serviceTypeInfo_Versions), func(i int) bool {
+		return serviceTypeInfo_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	})
+	if index < len(serviceTypeInfo_Versions) {
+		if serviceTypeInfo_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+			index--
+		}
+		expectedSize := serviceTypeInfo_Versions[index].Size
+		if expectedSize != header.Size {
+			return &bindings.ValidationError{bindings.UnexpectedStructHeader,
+				fmt.Sprintf("invalid struct header size: should be %d, but was %d", expectedSize, header.Size),
+			}
+		}
+	}
+	if header.ElementsOrVersion >= 0 {
+		pointer0, err := decoder.ReadPointer()
+		if err != nil {
+			return err
+		}
+		if pointer0 == 0 {
+			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+		} else {
+			value0, err := decoder.ReadString()
+			if err != nil {
+				return err
+			}
+			s.TopLevelInterface = value0
+		}
+	}
+	if header.ElementsOrVersion >= 0 {
+		pointer0, err := decoder.ReadPointer()
+		if err != nil {
+			return err
+		}
+		if pointer0 == 0 {
+			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+		} else {
+			len0, err := decoder.StartArray(64)
+			if err != nil {
+				return err
+			}
+			s.CompleteTypeSet = make([]string, len0)
+			for i0 := uint32(0); i0 < len0; i0++ {
+				pointer1, err := decoder.ReadPointer()
+				if err != nil {
+					return err
+				}
+				if pointer1 == 0 {
+					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+				} else {
+					value1, err := decoder.ReadString()
+					if err != nil {
+						return err
+					}
+					s.CompleteTypeSet[i0] = value1
+				}
+			}
+			if err := decoder.Finish(); err != nil {
+				return err
+			}
+		}
+	}
+	if err := decoder.Finish(); err != nil {
+		return err
+	}
+	return nil
+}
+
+
+
+type RuntimeTypeInfo struct {
+	ServicesByName map[string]ServiceTypeInfo
+	TypeMap map[string]UserDefinedType
+}
+
+func (s *RuntimeTypeInfo) Encode(encoder *bindings.Encoder) error {
+	encoder.StartStruct(16, 0)
+	if err := encoder.WritePointer(); err != nil {
+		return err
+	}
+	encoder.StartMap()
+	{
+		var keys0 []string
+		var values0 []ServiceTypeInfo
+		for key0, value0 := range s.ServicesByName {
+			keys0 = append(keys0, key0)
+			values0 = append(values0, value0)
+		}
+		if err := encoder.WritePointer(); err != nil {
+			return err
+		}
+		encoder.StartArray(uint32(len(keys0)), 64)
+		for _, elem1 := range keys0 {
+			if err := encoder.WritePointer(); err != nil {
+				return err
+			}
+			if err := encoder.WriteString(elem1); err != nil {
+				return err
+			}
+		}
+		if err := encoder.Finish(); err != nil {
+			return err
+		}
+		if err := encoder.WritePointer(); err != nil {
+			return err
+		}
+		encoder.StartArray(uint32(len(values0)), 64)
+		for _, elem1 := range values0 {
+			if err := encoder.WritePointer(); err != nil {
+				return err
+			}
+			if err := elem1.Encode(encoder); err != nil {
+				return err
+			}
+		}
+		if err := encoder.Finish(); err != nil {
+			return err
+		}
+	}
+	if err := encoder.Finish(); err != nil {
+		return err
+	}
+	if err := encoder.WritePointer(); err != nil {
+		return err
+	}
+	encoder.StartMap()
+	{
+		var keys0 []string
+		var values0 []UserDefinedType
+		for key0, value0 := range s.TypeMap {
+			keys0 = append(keys0, key0)
+			values0 = append(values0, value0)
+		}
+		if err := encoder.WritePointer(); err != nil {
+			return err
+		}
+		encoder.StartArray(uint32(len(keys0)), 64)
+		for _, elem1 := range keys0 {
+			if err := encoder.WritePointer(); err != nil {
+				return err
+			}
+			if err := encoder.WriteString(elem1); err != nil {
+				return err
+			}
+		}
+		if err := encoder.Finish(); err != nil {
+			return err
+		}
+		if err := encoder.WritePointer(); err != nil {
+			return err
+		}
+		encoder.StartArray(uint32(len(values0)), 128)
+		for _, elem1 := range values0 {
+			if elem1 == nil {
+				return &bindings.ValidationError{bindings.UnexpectedNullUnion, "unexpected null union"}
+			}
+			if err := elem1.Encode(encoder); err != nil {
+				return err
+			}
+		}
+		if err := encoder.Finish(); err != nil {
+			return err
+		}
+	}
+	if err := encoder.Finish(); err != nil {
+		return err
+	}
+	if err := encoder.Finish(); err != nil {
+		return err
+	}
+	return nil
+}
+
+var runtimeTypeInfo_Versions []bindings.DataHeader = []bindings.DataHeader{
+	bindings.DataHeader{24, 0},
+}
+
+func (s *RuntimeTypeInfo) Decode(decoder *bindings.Decoder) error {
+	header, err := decoder.StartStruct()
+	if err != nil {
+		return err
+	}
+	index := sort.Search(len(runtimeTypeInfo_Versions), func(i int) bool {
+		return runtimeTypeInfo_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	})
+	if index < len(runtimeTypeInfo_Versions) {
+		if runtimeTypeInfo_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+			index--
+		}
+		expectedSize := runtimeTypeInfo_Versions[index].Size
+		if expectedSize != header.Size {
+			return &bindings.ValidationError{bindings.UnexpectedStructHeader,
+				fmt.Sprintf("invalid struct header size: should be %d, but was %d", expectedSize, header.Size),
+			}
+		}
+	}
+	if header.ElementsOrVersion >= 0 {
+		pointer0, err := decoder.ReadPointer()
+		if err != nil {
+			return err
+		}
+		if pointer0 == 0 {
+			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+		} else {
+			if err := decoder.StartMap(); err != nil {
+				return err
+			}
+			var keys0 []string
+			{
+				pointer1, err := decoder.ReadPointer()
+				if err != nil {
+					return err
+				}
+				if pointer1 == 0 {
+					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+				} else {
+					len1, err := decoder.StartArray(64)
+					if err != nil {
+						return err
+					}
+					keys0 = make([]string, len1)
+					for i1 := uint32(0); i1 < len1; i1++ {
+						pointer2, err := decoder.ReadPointer()
+						if err != nil {
+							return err
+						}
+						if pointer2 == 0 {
+							return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+						} else {
+							value2, err := decoder.ReadString()
+							if err != nil {
+								return err
+							}
+							keys0[i1] = value2
+						}
+					}
+					if err := decoder.Finish(); err != nil {
+						return err
+					}
+				}
+			}
+			var values0 []ServiceTypeInfo
+			{
+				pointer1, err := decoder.ReadPointer()
+				if err != nil {
+					return err
+				}
+				if pointer1 == 0 {
+					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+				} else {
+					len1, err := decoder.StartArray(64)
+					if err != nil {
+						return err
+					}
+					values0 = make([]ServiceTypeInfo, len1)
+					for i1 := uint32(0); i1 < len1; i1++ {
+						pointer2, err := decoder.ReadPointer()
+						if err != nil {
+							return err
+						}
+						if pointer2 == 0 {
+							return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+						} else {
+							if err := values0[i1].Decode(decoder); err != nil {
+								return err
+							}
+						}
+					}
+					if err := decoder.Finish(); err != nil {
+						return err
+					}
+				}
+			}
+			if len(keys0) != len(values0) {
+				return &bindings.ValidationError{bindings.DifferentSizedArraysInMap,
+					fmt.Sprintf("Number of keys %d is different from number of values %d", len(keys0), len(values0)),
+				}
+			}
+			if err := decoder.Finish(); err != nil {
+				return err
+			}
+			len0 := len(keys0)
+			map0 := make(map[string]ServiceTypeInfo)
+			for i0 := 0; i0 < len0; i0++ {
+				map0[keys0[i0]] = values0[i0]
+			}
+			s.ServicesByName = map0
+		}
+	}
+	if header.ElementsOrVersion >= 0 {
+		pointer0, err := decoder.ReadPointer()
+		if err != nil {
+			return err
+		}
+		if pointer0 == 0 {
+			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+		} else {
+			if err := decoder.StartMap(); err != nil {
+				return err
+			}
+			var keys0 []string
+			{
+				pointer1, err := decoder.ReadPointer()
+				if err != nil {
+					return err
+				}
+				if pointer1 == 0 {
+					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+				} else {
+					len1, err := decoder.StartArray(64)
+					if err != nil {
+						return err
+					}
+					keys0 = make([]string, len1)
+					for i1 := uint32(0); i1 < len1; i1++ {
+						pointer2, err := decoder.ReadPointer()
+						if err != nil {
+							return err
+						}
+						if pointer2 == 0 {
+							return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+						} else {
+							value2, err := decoder.ReadString()
+							if err != nil {
+								return err
+							}
+							keys0[i1] = value2
+						}
+					}
+					if err := decoder.Finish(); err != nil {
+						return err
+					}
+				}
+			}
+			var values0 []UserDefinedType
+			{
+				pointer1, err := decoder.ReadPointer()
+				if err != nil {
+					return err
+				}
+				if pointer1 == 0 {
+					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+				} else {
+					len1, err := decoder.StartArray(128)
+					if err != nil {
+						return err
+					}
+					values0 = make([]UserDefinedType, len1)
+					for i1 := uint32(0); i1 < len1; i1++ {
+						var err error
+						values0[i1], err = DecodeUserDefinedType(decoder)
+						if err != nil {
+							return err
+						}
+						if values0[i1] == nil {
+							return &bindings.ValidationError{bindings.UnexpectedNullUnion, "unexpected null union"}
+						}
+					}
+					if err := decoder.Finish(); err != nil {
+						return err
+					}
+				}
+			}
+			if len(keys0) != len(values0) {
+				return &bindings.ValidationError{bindings.DifferentSizedArraysInMap,
+					fmt.Sprintf("Number of keys %d is different from number of values %d", len(keys0), len(values0)),
+				}
+			}
+			if err := decoder.Finish(); err != nil {
+				return err
+			}
+			len0 := len(keys0)
+			map0 := make(map[string]UserDefinedType)
+			for i0 := 0; i0 < len0; i0++ {
+				map0[keys0[i0]] = values0[i0]
+			}
+			s.TypeMap = map0
+		}
+	}
+	if err := decoder.Finish(); err != nil {
+		return err
+	}
+	return nil
+}
+
+
+
 type Type interface {
 	Tag() uint32
 	Interface() interface{}
diff --git a/mojom/mojom_parser/serialization/serialization.go b/mojom/mojom_parser/serialization/serialization.go
index e0ff2d9..d4ddff3 100644
--- a/mojom/mojom_parser/serialization/serialization.go
+++ b/mojom/mojom_parser/serialization/serialization.go
@@ -129,8 +129,8 @@
 	// We will populate a RuntimeTypeInfo structure and then serialize it and
 	// the serialized bytes will form the |serialized_runtime_type_info| field
 	// of the MojomFile.
-	typeInfo := mojom_files.RuntimeTypeInfo{}
-	typeInfo.ServicesByName = make(map[string]mojom_files.ServiceTypeInfo)
+	typeInfo := mojom_types.RuntimeTypeInfo{}
+	typeInfo.ServicesByName = make(map[string]mojom_types.ServiceTypeInfo)
 	typeInfo.TypeMap = make(map[string]mojom_types.UserDefinedType)
 
 	// We populate the declared_mojom_objects field
@@ -221,10 +221,10 @@
 // addServiceTypeInfo will add a ServiceTypeInfo to the ServicesByName field of |typeInfo| corresponding
 // to |intrfc| if |intrfc| is a top-level interface, meaning that it has a non-nil service name. In that
 // case this method returns true. Otherwise this method will do nothing and return fals.
-func addServiceTypeInfo(intrfc *mojom.MojomInterface, typeInfo *mojom_files.RuntimeTypeInfo) (isTopLevel bool) {
+func addServiceTypeInfo(intrfc *mojom.MojomInterface, typeInfo *mojom_types.RuntimeTypeInfo) (isTopLevel bool) {
 	isTopLevel = intrfc.ServiceName != nil
 	if isTopLevel {
-		serviceTypeInfo := mojom_files.ServiceTypeInfo{}
+		serviceTypeInfo := mojom_types.ServiceTypeInfo{}
 		serviceTypeInfo.TopLevelInterface = intrfc.TypeKey()
 		serviceTypeInfo.CompleteTypeSet = intrfc.FindReachableTypes()
 		typeInfo.ServicesByName[*intrfc.ServiceName] = serviceTypeInfo
diff --git a/mojom/mojom_parser/serialization/serialization_test.go b/mojom/mojom_parser/serialization/serialization_test.go
index 69eee81..3c543f5 100644
--- a/mojom/mojom_parser/serialization/serialization_test.go
+++ b/mojom/mojom_parser/serialization/serialization_test.go
@@ -1269,8 +1269,8 @@
 	// The contents of the two files
 	mojomContentsA           string
 	mojomContentsB           string
-	expectedRuntimeTypeInfoA *mojom_files.RuntimeTypeInfo
-	expectedRuntimeTypeInfoB *mojom_files.RuntimeTypeInfo
+	expectedRuntimeTypeInfoA *mojom_types.RuntimeTypeInfo
+	expectedRuntimeTypeInfoB *mojom_types.RuntimeTypeInfo
 }
 
 type runtimeTypeInfoTest struct {
@@ -1278,19 +1278,19 @@
 	testCaseNum int
 }
 
-func (t *runtimeTypeInfoTest) expectedRuntimeTypeInfoA() *mojom_files.RuntimeTypeInfo {
+func (t *runtimeTypeInfoTest) expectedRuntimeTypeInfoA() *mojom_types.RuntimeTypeInfo {
 	return t.cases[t.testCaseNum].expectedRuntimeTypeInfoA
 }
 
-func (t *runtimeTypeInfoTest) expectedRuntimeTypeInfoB() *mojom_files.RuntimeTypeInfo {
+func (t *runtimeTypeInfoTest) expectedRuntimeTypeInfoB() *mojom_types.RuntimeTypeInfo {
 	return t.cases[t.testCaseNum].expectedRuntimeTypeInfoB
 }
 
 func (test *runtimeTypeInfoTest) addTestCase(contentsA, contentsB string) {
-	test.cases = append(test.cases, runtimeTypeInfoTestCase{contentsA, contentsB, new(mojom_files.RuntimeTypeInfo), new(mojom_files.RuntimeTypeInfo)})
-	test.expectedRuntimeTypeInfoA().ServicesByName = make(map[string]mojom_files.ServiceTypeInfo)
+	test.cases = append(test.cases, runtimeTypeInfoTestCase{contentsA, contentsB, new(mojom_types.RuntimeTypeInfo), new(mojom_types.RuntimeTypeInfo)})
+	test.expectedRuntimeTypeInfoA().ServicesByName = make(map[string]mojom_types.ServiceTypeInfo)
 	test.expectedRuntimeTypeInfoA().TypeMap = make(map[string]mojom_types.UserDefinedType)
-	test.expectedRuntimeTypeInfoB().ServicesByName = make(map[string]mojom_files.ServiceTypeInfo)
+	test.expectedRuntimeTypeInfoB().ServicesByName = make(map[string]mojom_types.ServiceTypeInfo)
 	test.expectedRuntimeTypeInfoB().TypeMap = make(map[string]mojom_types.UserDefinedType)
 }
 
@@ -1476,7 +1476,7 @@
 		test.addTestCase(contentsA, contentsB)
 
 		// ServicesByName for file A
-		test.expectedRuntimeTypeInfoA().ServicesByName["AwesomeService"] = mojom_files.ServiceTypeInfo{
+		test.expectedRuntimeTypeInfoA().ServicesByName["AwesomeService"] = mojom_types.ServiceTypeInfo{
 			TopLevelInterface: "TYPE_KEY:a.b.c.InterfaceA",
 			CompleteTypeSet:   []string{"TYPE_KEY:a.b.c.FooA", "TYPE_KEY:a.b.c.InterfaceA", "TYPE_KEY:b.c.d.FooB"},
 		}
@@ -1592,7 +1592,7 @@
 		test.addTestCase(contentsA, contentsB)
 
 		// ServicesByName for file A
-		test.expectedRuntimeTypeInfoA().ServicesByName["AwesomeService"] = mojom_files.ServiceTypeInfo{
+		test.expectedRuntimeTypeInfoA().ServicesByName["AwesomeService"] = mojom_types.ServiceTypeInfo{
 			TopLevelInterface: "TYPE_KEY:a.b.c.InterfaceA",
 			CompleteTypeSet:   []string{"TYPE_KEY:a.b.c.FooA", "TYPE_KEY:a.b.c.InterfaceA", "TYPE_KEY:b.c.d.FooB"},
 		}
@@ -1717,7 +1717,7 @@
 		test.addTestCase(contentsA, contentsB)
 
 		// ServicesByName for file A
-		test.expectedRuntimeTypeInfoA().ServicesByName["AwesomeService"] = mojom_files.ServiceTypeInfo{
+		test.expectedRuntimeTypeInfoA().ServicesByName["AwesomeService"] = mojom_types.ServiceTypeInfo{
 			TopLevelInterface: "TYPE_KEY:a.b.c.InterfaceA",
 			CompleteTypeSet:   []string{"TYPE_KEY:a.b.c.FooA", "TYPE_KEY:a.b.c.InterfaceA", "TYPE_KEY:b.c.d.Enum1", "TYPE_KEY:b.c.d.FooB"},
 		}
@@ -1879,12 +1879,12 @@
 
 		// Deserialize  RuntimeTypeInfo A
 		decoder = bindings.NewDecoder(*fileGraph.Files[fileNameA].SerializedRuntimeTypeInfo, nil)
-		runtimeTypeInfoA := mojom_files.RuntimeTypeInfo{}
+		runtimeTypeInfoA := mojom_types.RuntimeTypeInfo{}
 		runtimeTypeInfoA.Decode(decoder)
 
 		// Deserialize  RuntimeTypeInfo B
 		decoder = bindings.NewDecoder(*fileGraph.Files[fileNameB].SerializedRuntimeTypeInfo, nil)
-		runtimeTypeInfoB := mojom_files.RuntimeTypeInfo{}
+		runtimeTypeInfoB := mojom_types.RuntimeTypeInfo{}
 		runtimeTypeInfoB.Decode(decoder)
 
 		// Compare A