diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index 8010e63..df11b53 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -28,14 +28,14 @@
   return obj;
 }
 
-List<int> assertInts(List<int> list) {
+List<int> assertListOfInt(List<int> list) {
   for (int elem in list) {
     assertInt(elem);
   }
   return list;
 }
 
-List<String> assertStrings(List<String> list) {
+List<String> assertListOfString(List<String> list) {
   for (String elem in list) {
     assertString(elem);
   }
@@ -236,7 +236,7 @@
 vms.AllocationProfile assertAllocationProfile(vms.AllocationProfile obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertClassHeapStatss(obj.members);
+  assertListOfClassHeapStats(obj.members);
   assertMemoryUsage(obj.memoryUsage);
   return obj;
 }
@@ -273,7 +273,8 @@
   return obj;
 }
 
-List<vms.BoundVariable> assertBoundVariables(List<vms.BoundVariable> list) {
+List<vms.BoundVariable> assertListOfBoundVariable(
+    List<vms.BoundVariable> list) {
   for (vms.BoundVariable elem in list) {
     assertBoundVariable(elem);
   }
@@ -296,7 +297,7 @@
   return obj;
 }
 
-List<vms.Breakpoint> assertBreakpoints(List<vms.Breakpoint> list) {
+List<vms.Breakpoint> assertListOfBreakpoint(List<vms.Breakpoint> list) {
   for (vms.Breakpoint elem in list) {
     assertBreakpoint(elem);
   }
@@ -311,7 +312,7 @@
   return obj;
 }
 
-List<vms.ClassRef> assertClassRefs(List<vms.ClassRef> list) {
+List<vms.ClassRef> assertListOfClassRef(List<vms.ClassRef> list) {
   for (vms.ClassRef elem in list) {
     assertClassRef(elem);
   }
@@ -326,10 +327,10 @@
   assertBool(obj.isAbstract);
   assertBool(obj.isConst);
   assertLibraryRef(obj.library);
-  assertInstanceRefs(obj.interfaces);
-  assertFieldRefs(obj.fields);
-  assertFuncRefs(obj.functions);
-  assertClassRefs(obj.subclasses);
+  assertListOfInstanceRef(obj.interfaces);
+  assertListOfFieldRef(obj.fields);
+  assertListOfFuncRef(obj.functions);
+  assertListOfClassRef(obj.subclasses);
   return obj;
 }
 
@@ -344,7 +345,8 @@
   return obj;
 }
 
-List<vms.ClassHeapStats> assertClassHeapStatss(List<vms.ClassHeapStats> list) {
+List<vms.ClassHeapStats> assertListOfClassHeapStats(
+    List<vms.ClassHeapStats> list) {
   for (vms.ClassHeapStats elem in list) {
     assertClassHeapStats(elem);
   }
@@ -354,7 +356,7 @@
 vms.ClassList assertClassList(vms.ClassList obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertClassRefs(obj.classes);
+  assertListOfClassRef(obj.classes);
   return obj;
 }
 
@@ -367,7 +369,7 @@
   return obj;
 }
 
-List<vms.CodeRef> assertCodeRefs(List<vms.CodeRef> list) {
+List<vms.CodeRef> assertListOfCodeRef(List<vms.CodeRef> list) {
   for (vms.CodeRef elem in list) {
     assertCodeRef(elem);
   }
@@ -391,7 +393,7 @@
   return obj;
 }
 
-List<vms.ContextRef> assertContextRefs(List<vms.ContextRef> list) {
+List<vms.ContextRef> assertListOfContextRef(List<vms.ContextRef> list) {
   for (vms.ContextRef elem in list) {
     assertContextRef(elem);
   }
@@ -403,7 +405,7 @@
   assertString(obj.type);
   assertString(obj.id);
   assertInt(obj.length);
-  assertContextElements(obj.variables);
+  assertListOfContextElement(obj.variables);
   return obj;
 }
 
@@ -419,7 +421,8 @@
   return obj;
 }
 
-List<vms.ContextElement> assertContextElements(List<vms.ContextElement> list) {
+List<vms.ContextElement> assertListOfContextElement(
+    List<vms.ContextElement> list) {
   for (vms.ContextElement elem in list) {
     assertContextElement(elem);
   }
@@ -435,7 +438,7 @@
   return obj;
 }
 
-List<vms.ErrorRef> assertErrorRefs(List<vms.ErrorRef> list) {
+List<vms.ErrorRef> assertListOfErrorRef(List<vms.ErrorRef> list) {
   for (vms.ErrorRef elem in list) {
     assertErrorRef(elem);
   }
@@ -477,7 +480,7 @@
   return obj;
 }
 
-List<vms.FieldRef> assertFieldRefs(List<vms.FieldRef> list) {
+List<vms.FieldRef> assertListOfFieldRef(List<vms.FieldRef> list) {
   for (vms.FieldRef elem in list) {
     assertFieldRef(elem);
   }
@@ -505,7 +508,7 @@
   return obj;
 }
 
-List<vms.Flag> assertFlags(List<vms.Flag> list) {
+List<vms.Flag> assertListOfFlag(List<vms.Flag> list) {
   for (vms.Flag elem in list) {
     assertFlag(elem);
   }
@@ -515,7 +518,7 @@
 vms.FlagList assertFlagList(vms.FlagList obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertFlags(obj.flags);
+  assertListOfFlag(obj.flags);
   return obj;
 }
 
@@ -526,7 +529,7 @@
   return obj;
 }
 
-List<vms.Frame> assertFrames(List<vms.Frame> list) {
+List<vms.Frame> assertListOfFrame(List<vms.Frame> list) {
   for (vms.Frame elem in list) {
     assertFrame(elem);
   }
@@ -552,7 +555,7 @@
   return obj;
 }
 
-List<vms.FuncRef> assertFuncRefs(List<vms.FuncRef> list) {
+List<vms.FuncRef> assertListOfFuncRef(List<vms.FuncRef> list) {
   for (vms.FuncRef elem in list) {
     assertFuncRef(elem);
   }
@@ -585,7 +588,7 @@
   return obj;
 }
 
-List<vms.InstanceRef> assertInstanceRefs(List<vms.InstanceRef> list) {
+List<vms.InstanceRef> assertListOfInstanceRef(List<vms.InstanceRef> list) {
   for (vms.InstanceRef elem in list) {
     assertInstanceRef(elem);
   }
@@ -610,7 +613,7 @@
   return obj;
 }
 
-List<vms.IsolateRef> assertIsolateRefs(List<vms.IsolateRef> list) {
+List<vms.IsolateRef> assertListOfIsolateRef(List<vms.IsolateRef> list) {
   for (vms.IsolateRef elem in list) {
     assertIsolateRef(elem);
   }
@@ -628,8 +631,8 @@
   assertInt(obj.livePorts);
   assertBool(obj.pauseOnExit);
   assertEvent(obj.pauseEvent);
-  assertLibraryRefs(obj.libraries);
-  assertBreakpoints(obj.breakpoints);
+  assertListOfLibraryRef(obj.libraries);
+  assertListOfBreakpoint(obj.breakpoints);
   assertExceptionPauseMode(obj.exceptionPauseMode);
   return obj;
 }
@@ -637,7 +640,7 @@
 vms.InboundReferences assertInboundReferences(vms.InboundReferences obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertInboundReferences(obj.references);
+  assertListOfInboundReference(obj.references);
   return obj;
 }
 
@@ -647,11 +650,19 @@
   return obj;
 }
 
+List<vms.InboundReference> assertListOfInboundReference(
+    List<vms.InboundReference> list) {
+  for (vms.InboundReference elem in list) {
+    assertInboundReference(elem);
+  }
+  return list;
+}
+
 vms.InstanceSet assertInstanceSet(vms.InstanceSet obj) {
   assertNotNull(obj);
   assertString(obj.type);
   assertInt(obj.totalCount);
-  assertObjRefs(obj.instances);
+  assertListOfObjRef(obj.instances);
   return obj;
 }
 
@@ -664,7 +675,7 @@
   return obj;
 }
 
-List<vms.LibraryRef> assertLibraryRefs(List<vms.LibraryRef> list) {
+List<vms.LibraryRef> assertListOfLibraryRef(List<vms.LibraryRef> list) {
   for (vms.LibraryRef elem in list) {
     assertLibraryRef(elem);
   }
@@ -678,11 +689,11 @@
   assertString(obj.name);
   assertString(obj.uri);
   assertBool(obj.debuggable);
-  assertLibraryDependencies(obj.dependencies);
-  assertScriptRefs(obj.scripts);
-  assertFieldRefs(obj.variables);
-  assertFuncRefs(obj.functions);
-  assertClassRefs(obj.classes);
+  assertListOfLibraryDependency(obj.dependencies);
+  assertListOfScriptRef(obj.scripts);
+  assertListOfFieldRef(obj.variables);
+  assertListOfFuncRef(obj.functions);
+  assertListOfClassRef(obj.classes);
   return obj;
 }
 
@@ -695,7 +706,7 @@
   return obj;
 }
 
-List<vms.LibraryDependency> assertLibraryDependencies(
+List<vms.LibraryDependency> assertListOfLibraryDependency(
     List<vms.LibraryDependency> list) {
   for (vms.LibraryDependency elem in list) {
     assertLibraryDependency(elem);
@@ -755,7 +766,7 @@
   return obj;
 }
 
-List<vms.Message> assertMessages(List<vms.Message> list) {
+List<vms.Message> assertListOfMessage(List<vms.Message> list) {
   for (vms.Message elem in list) {
     assertMessage(elem);
   }
@@ -772,7 +783,7 @@
   return obj;
 }
 
-List<vms.NullValRef> assertNullValRefs(List<vms.NullValRef> list) {
+List<vms.NullValRef> assertListOfNullValRef(List<vms.NullValRef> list) {
   for (vms.NullValRef elem in list) {
     assertNullValRef(elem);
   }
@@ -796,7 +807,7 @@
   return obj;
 }
 
-List<vms.ObjRef> assertObjRefs(List<vms.ObjRef> list) {
+List<vms.ObjRef> assertListOfObjRef(List<vms.ObjRef> list) {
   for (vms.ObjRef elem in list) {
     assertObjRef(elem);
   }
@@ -823,12 +834,20 @@
   return obj;
 }
 
+List<vms.RetainingObject> assertListOfRetainingObject(
+    List<vms.RetainingObject> list) {
+  for (vms.RetainingObject elem in list) {
+    assertRetainingObject(elem);
+  }
+  return list;
+}
+
 vms.RetainingPath assertRetainingPath(vms.RetainingPath obj) {
   assertNotNull(obj);
   assertString(obj.type);
   assertInt(obj.length);
   assertString(obj.gcRootType);
-  assertRetainingObjects(obj.elements);
+  assertListOfRetainingObject(obj.elements);
   return obj;
 }
 
@@ -854,7 +873,7 @@
   return obj;
 }
 
-List<vms.ScriptRef> assertScriptRefs(List<vms.ScriptRef> list) {
+List<vms.ScriptRef> assertListOfScriptRef(List<vms.ScriptRef> list) {
   for (vms.ScriptRef elem in list) {
     assertScriptRef(elem);
   }
@@ -873,7 +892,7 @@
 vms.ScriptList assertScriptList(vms.ScriptList obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertScriptRefs(obj.scripts);
+  assertListOfScriptRef(obj.scripts);
   return obj;
 }
 
@@ -888,16 +907,16 @@
 vms.SourceReport assertSourceReport(vms.SourceReport obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertSourceReportRanges(obj.ranges);
-  assertScriptRefs(obj.scripts);
+  assertListOfSourceReportRange(obj.ranges);
+  assertListOfScriptRef(obj.scripts);
   return obj;
 }
 
 vms.SourceReportCoverage assertSourceReportCoverage(
     vms.SourceReportCoverage obj) {
   assertNotNull(obj);
-  assertInts(obj.hits);
-  assertInts(obj.misses);
+  assertListOfInt(obj.hits);
+  assertListOfInt(obj.misses);
   return obj;
 }
 
@@ -910,7 +929,7 @@
   return obj;
 }
 
-List<vms.SourceReportRange> assertSourceReportRanges(
+List<vms.SourceReportRange> assertListOfSourceReportRange(
     List<vms.SourceReportRange> list) {
   for (vms.SourceReportRange elem in list) {
     assertSourceReportRange(elem);
@@ -921,15 +940,15 @@
 vms.Stack assertStack(vms.Stack obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertFrames(obj.frames);
-  assertMessages(obj.messages);
+  assertListOfFrame(obj.frames);
+  assertListOfMessage(obj.messages);
   return obj;
 }
 
 vms.Timeline assertTimeline(vms.Timeline obj) {
   assertNotNull(obj);
   assertString(obj.type);
-  assertTimelineEvents(obj.traceEvents);
+  assertListOfTimelineEvent(obj.traceEvents);
   assertInt(obj.timeOriginMicros);
   assertInt(obj.timeExtentMicros);
   return obj;
@@ -940,7 +959,8 @@
   return obj;
 }
 
-List<vms.TimelineEvent> assertTimelineEvents(List<vms.TimelineEvent> list) {
+List<vms.TimelineEvent> assertListOfTimelineEvent(
+    List<vms.TimelineEvent> list) {
   for (vms.TimelineEvent elem in list) {
     assertTimelineEvent(elem);
   }
@@ -951,8 +971,8 @@
   assertNotNull(obj);
   assertString(obj.type);
   assertString(obj.recorderName);
-  assertStrings(obj.availableStreams);
-  assertStrings(obj.recordedStreams);
+  assertListOfString(obj.availableStreams);
+  assertListOfString(obj.recordedStreams);
   return obj;
 }
 
@@ -971,7 +991,7 @@
   return obj;
 }
 
-List<vms.TypeArgumentsRef> assertTypeArgumentsRefs(
+List<vms.TypeArgumentsRef> assertListOfTypeArgumentsRef(
     List<vms.TypeArgumentsRef> list) {
   for (vms.TypeArgumentsRef elem in list) {
     assertTypeArgumentsRef(elem);
@@ -984,7 +1004,7 @@
   assertString(obj.type);
   assertString(obj.id);
   assertString(obj.name);
-  assertInstanceRefs(obj.types);
+  assertListOfInstanceRef(obj.types);
   return obj;
 }
 
@@ -1010,7 +1030,7 @@
   return obj;
 }
 
-List<vms.VMRef> assertVMRefs(List<vms.VMRef> list) {
+List<vms.VMRef> assertListOfVMRef(List<vms.VMRef> list) {
   for (vms.VMRef elem in list) {
     assertVMRef(elem);
   }
@@ -1028,6 +1048,6 @@
   assertString(obj.version);
   assertInt(obj.pid);
   assertInt(obj.startTime);
-  assertIsolateRefs(obj.isolates);
+  assertListOfIsolateRef(obj.isolates);
   return obj;
 }
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 04e8b59..244f517 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -811,14 +811,14 @@
   return obj;
 }
 
-List<int> assertInts(List<int> list) {
+List<int> assertListOfInt(List<int> list) {
   for (int elem in list) {
     assertInt(elem);
   }
   return list;
 }
 
-List<String> assertStrings(List<String> list) {
+List<String> assertListOfString(List<String> list) {
   for (String elem in list) {
     assertString(elem);
   }
@@ -902,15 +902,17 @@
           [
             'BoundVariable',
             'Breakpoint',
+            'ClassHeapStats',
+            'CodeRegion',
             'ContextElement',
             'Flag',
             'Frame',
+            'InboundReference',
             'LibraryDependency',
             'Message',
-            'SourceReportRange',
-            'ClassHeapStats',
-            'CodeRegion',
             'ProfileFunction',
+            'RetainingObject',
+            'SourceReportRange',
             'TimelineEvent',
           ].contains(type.name)) {
         type.generateListAssert(gen);
@@ -1187,10 +1189,6 @@
           name == 'bool' ||
           name == 'double');
 
-  String get namePlural => name.endsWith('y')
-      ? name.substring(0, name.length - 1) + 'ies'
-      : name + 's';
-
   String toString() => ref;
 }
 
@@ -1207,6 +1205,8 @@
   void generate(DartGenerator gen) {
     gen.write('${type.ref} ${name}');
   }
+
+  String toString() => '$type $name';
 }
 
 class Type extends Member {
@@ -1251,10 +1251,6 @@
 
   bool get isRef => name.endsWith('Ref');
 
-  String get namePlural => name.endsWith('y')
-      ? name.substring(0, name.length - 1) + 'ies'
-      : name + 's';
-
   bool get supportsIdentity {
     if (fields.any((f) => f.name == 'id')) return true;
     return superName == null ? false : getSuper().supportsIdentity;
@@ -1535,9 +1531,9 @@
         if (type.isArray) {
           TypeRef arrayType = type.types.first;
           if (arrayType.arrayDepth == 1) {
-            String assertMethodName = 'assert' +
+            String assertMethodName = 'assertListOf' +
                 arrayType.name.substring(0, 1).toUpperCase() +
-                arrayType.namePlural.substring(1);
+                arrayType.name.substring(1);
             gen.writeln('$assertMethodName(obj.${field.generatableName});');
           } else {
             gen.writeln(
@@ -1574,7 +1570,7 @@
 
   void generateListAssert(DartGenerator gen) {
     gen.writeln('List<vms.${name}> '
-        'assert${namePlural}(List<vms.${name}> list) {');
+        'assertListOf${name}(List<vms.${name}> list) {');
     gen.writeln('for (vms.${name} elem in list) {');
     gen.writeln('assert${name}(elem);');
     gen.writeln('}');
diff --git a/pkg/vm_service/tool/generate.dart b/pkg/vm_service/tool/generate.dart
index 151814f..73e8d2e 100644
--- a/pkg/vm_service/tool/generate.dart
+++ b/pkg/vm_service/tool/generate.dart
@@ -46,7 +46,11 @@
   dart.api.parse(nodes);
   dart.api.generate(generator);
   outputFile.writeAsStringSync(generator.toString());
-  Process.runSync('dartfmt', ['-w', outDirPath]);
+  ProcessResult result = Process.runSync('dartfmt', ['-w', outDirPath]);
+  if (result.exitCode != 0) {
+    print('dartfmt: ${result.stdout}\n${result.stderr}');
+    throw result.exitCode;
+  }
 
   if (_stampPubspecVersion) {
     // Update the pubspec file.
@@ -99,7 +103,11 @@
   dart.api.parse(nodes);
   dart.api.generateAsserts(generator);
   outputFile.writeAsStringSync(generator.toString());
-  Process.runSync('dartfmt', ['-w', outDirPath]);
+  ProcessResult result = Process.runSync('dartfmt', ['-w', outDirPath]);
+  if (result.exitCode != 0) {
+    print('dartfmt: ${result.stdout}\n${result.stderr}');
+    throw result.exitCode;
+  }
 
   if (_stampPubspecVersion) {
     // Update the pubspec file.
