Version 2.13.0-192.0.dev

Merge commit 'd5f3189c91c289b8567d9bea7c36d3f427dd403d' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index fc66822..9bae526 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -312,6 +312,9 @@
   DemoteViaExplicitWrite(this.variable, this.writeExpression);
 
   @override
+  String get documentationLink => 'http://dart.dev/go/non-promo-write';
+
+  @override
   String get shortName => 'explicitWrite';
 
   @override
@@ -340,6 +343,9 @@
   DemoteViaForEachVariableWrite(this.variable, this.node);
 
   @override
+  String get documentationLink => 'http://dart.dev/go/non-promo-write';
+
+  @override
   String get shortName => 'explicitWrite';
 
   @override
@@ -2332,6 +2338,11 @@
 
 /// Abstract class representing a reason why something was not promoted.
 abstract class NonPromotionReason {
+  /// Link to documentation describing this non-promotion reason; this should be
+  /// presented to the user as a source of additional information about the
+  /// error.
+  String get documentationLink;
+
   /// Short text description of this non-promotion reason; intended for ID
   /// testing.
   String get shortName;
@@ -2372,6 +2383,9 @@
   PropertyNotPromoted(this.propertyName, this.staticType);
 
   @override
+  String get documentationLink => 'http://dart.dev/go/non-promo-property';
+
+  @override
   String get shortName => 'propertyNotPromoted';
 
   @override
@@ -2607,6 +2621,9 @@
 /// promoted due to the fact that it's a reference to `this`.
 class ThisNotPromoted extends NonPromotionReason {
   @override
+  String get documentationLink => 'http://dart.dev/go/non-promo-this';
+
+  @override
   String get shortName => 'thisNotPromoted';
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 96608e0..32b1b05 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -4110,25 +4110,29 @@
     tip: r"""Try removing 'this.'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateFieldNotPromoted =
-    const Template<Message Function(String name)>(
+const Template<Message Function(String name, String string)>
+    templateFieldNotPromoted =
+    const Template<Message Function(String name, String string)>(
         messageTemplate:
             r"""'#name' refers to a property so it couldn't be promoted.""",
+        tipTemplate: r"""See #string""",
         withArguments: _withArgumentsFieldNotPromoted);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeFieldNotPromoted =
-    const Code<Message Function(String name)>(
+const Code<Message Function(String name, String string)> codeFieldNotPromoted =
+    const Code<Message Function(String name, String string)>(
   "FieldNotPromoted",
 );
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFieldNotPromoted(String name) {
+Message _withArgumentsFieldNotPromoted(String name, String string) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeFieldNotPromoted,
       message: """'${name}' refers to a property so it couldn't be promoted.""",
-      arguments: {'name': name});
+      tip: """See ${string}""",
+      arguments: {'name': name, 'string': string});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9073,11 +9077,26 @@
     tip: r"""Try replacing '?.' with '.'""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeThisNotPromoted = messageThisNotPromoted;
+const Template<Message Function(String string)> templateThisNotPromoted =
+    const Template<Message Function(String string)>(
+        messageTemplate: r"""'this' can't be promoted.""",
+        tipTemplate: r"""See #string""",
+        withArguments: _withArgumentsThisNotPromoted);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageThisNotPromoted = const MessageCode("ThisNotPromoted",
-    message: r"""'this' can't be promoted.""");
+const Code<Message Function(String string)> codeThisNotPromoted =
+    const Code<Message Function(String string)>(
+  "ThisNotPromoted",
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsThisNotPromoted(String string) {
+  if (string.isEmpty) throw 'No string provided';
+  return new Message(codeThisNotPromoted,
+      message: """'this' can't be promoted.""",
+      tip: """See ${string}""",
+      arguments: {'string': string});
+}
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)>
@@ -9688,29 +9707,33 @@
         r"""Try removing the keyword 'var', or replacing it with the name of the return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
+const Template<Message Function(String name, String string)>
     templateVariableCouldBeNullDueToWrite =
-    const Template<Message Function(String name)>(
+    const Template<Message Function(String name, String string)>(
         messageTemplate:
             r"""Variable '#name' could be null due to an intervening write.""",
-        tipTemplate: r"""Try null checking the variable after the write.""",
+        tipTemplate:
+            r"""Try null checking the variable after the write.  See #string""",
         withArguments: _withArgumentsVariableCouldBeNullDueToWrite);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeVariableCouldBeNullDueToWrite =
-    const Code<Message Function(String name)>(
+const Code<Message Function(String name, String string)>
+    codeVariableCouldBeNullDueToWrite =
+    const Code<Message Function(String name, String string)>(
   "VariableCouldBeNullDueToWrite",
 );
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsVariableCouldBeNullDueToWrite(String name) {
+Message _withArgumentsVariableCouldBeNullDueToWrite(
+    String name, String string) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
+  if (string.isEmpty) throw 'No string provided';
   return new Message(codeVariableCouldBeNullDueToWrite,
       message:
           """Variable '${name}' could be null due to an intervening write.""",
-      tip: """Try null checking the variable after the write.""",
-      arguments: {'name': name});
+      tip: """Try null checking the variable after the write.  See ${string}""",
+      arguments: {'name': name, 'string': string});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index 31da867..69a138e 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -5754,6 +5754,9 @@
 }
 
 class _MockNonPromotionReason extends NonPromotionReason {
+  @override
+  String get documentationLink => fail('Unexpected call to documentationLink');
+
   String get shortName => fail('Unexpected call to shortName');
 
   R accept<R, Node extends Object, Expression extends Object,
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 997af2c..47f6905 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -3472,7 +3472,7 @@
     }
     var variableName = reason.variable.name;
     if (variableName == null) return null;
-    return _contextMessageForWrite(variableName, writeExpression);
+    return _contextMessageForWrite(variableName, writeExpression, reason);
   }
 
   @override
@@ -3496,7 +3496,7 @@
         _dataForTesting!.nonPromotionReasonTargets[identifier] =
             reason.shortName;
       }
-      return _contextMessageForWrite(variableName, identifier);
+      return _contextMessageForWrite(variableName, identifier, reason);
     } else {
       assert(false, 'Unexpected parts type');
       return null;
@@ -3521,7 +3521,8 @@
     if (receiverElement is PropertyAccessorElement) {
       propertyReference = receiverElement;
       propertyType = reason.staticType;
-      return _contextMessageForProperty(receiverElement, reason.propertyName);
+      return _contextMessageForProperty(
+          receiverElement, reason.propertyName, reason);
     } else {
       assert(receiverElement == null,
           'Unrecognized property element: ${receiverElement.runtimeType}');
@@ -3533,27 +3534,29 @@
   DiagnosticMessage? visitThisNotPromoted(ThisNotPromoted reason) {
     return DiagnosticMessageImpl(
         filePath: source.fullName,
-        message: "'this' can't be promoted.",
+        message: "'this' can't be promoted.  See ${reason.documentationLink}",
         offset: _errorEntity.offset,
         length: _errorEntity.length);
   }
 
   DiagnosticMessageImpl _contextMessageForProperty(
-      PropertyAccessorElement property, String propertyName) {
+      PropertyAccessorElement property,
+      String propertyName,
+      NonPromotionReason reason) {
     return DiagnosticMessageImpl(
         filePath: property.source.fullName,
-        message:
-            "'$propertyName' refers to a property so it couldn't be promoted.",
+        message: "'$propertyName' refers to a property so it couldn't be "
+            "promoted.  See ${reason.documentationLink}",
         offset: property.nameOffset,
         length: property.nameLength);
   }
 
-  DiagnosticMessageImpl _contextMessageForWrite(
-      String variableName, Expression writeExpression) {
+  DiagnosticMessageImpl _contextMessageForWrite(String variableName,
+      Expression writeExpression, NonPromotionReason reason) {
     return DiagnosticMessageImpl(
         filePath: source.fullName,
         message: "Variable '$variableName' could be null due to an intervening "
-            "write.",
+            "write.  See ${reason.documentationLink}",
         offset: writeExpression.offset,
         length: writeExpression.length);
   }
diff --git a/pkg/compiler/pubspec.yaml b/pkg/compiler/pubspec.yaml
index 0f826c1..1073c93 100644
--- a/pkg/compiler/pubspec.yaml
+++ b/pkg/compiler/pubspec.yaml
@@ -31,6 +31,7 @@
 dev_dependencies:
   # Published packages - repo version ensured via dependency_overrides
   args: any
+  dart_style: any
   http: any
   js:
     path: ../js
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib1.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib1.dart
index 91a0c15..5f3aa4b 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib1.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib1.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import 'lib_100_0.dart' deferred as b1;
 
 entryLib1() async {
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib2.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib2.dart
index 37a0a7c..20313e2 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib2.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib2.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import 'lib_010_0.dart' deferred as b2;
 
 entryLib2() async {
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib3.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib3.dart
index 597682a..feeeeff 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib3.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib3.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import 'lib_001_0.dart' deferred as b3;
 
 entryLib3() async {
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib4.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib4.dart
index 41a32f6..fbbe564 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib4.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib4.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import 'lib_000_1.dart' deferred as b4;
 
 entryLib4() async {
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/libImport.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/libImport.dart
index 5731c13..4a2d52a 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/libImport.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/libImport.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import "package:expect/expect.dart";
 
 void v(Set<String> u, String name, int bit) {
@@ -11,6 +10,854 @@
   Expect.equals(name[bit], '1');
 }
 
+class C_100_0 {
+  const C_100_0();
+}
+
+class M_100_0 {}
+
+class T_100_0 {}
+
+const C_100_0 iC_100_0 = const C_100_0();
+closureC_100_0(foo) =>
+    (C_100_0 unused) => iC_100_0.toString() == foo.toString();
+
+class C_110_0 {
+  const C_110_0();
+}
+
+class M_110_0 {}
+
+class T_110_0 {}
+
+const C_110_0 iC_110_0 = const C_110_0();
+closureC_110_0(foo) =>
+    (C_110_0 unused) => iC_110_0.toString() == foo.toString();
+
+class C_101_1 {
+  const C_101_1();
+}
+
+class M_101_1 {}
+
+class T_101_1 {}
+
+const C_101_1 iC_101_1 = const C_101_1();
+closureC_101_1(foo) =>
+    (C_101_1 unused) => iC_101_1.toString() == foo.toString();
+
+class C_111_1 {
+  const C_111_1();
+}
+
+class M_111_1 {}
+
+class T_111_1 {}
+
+const C_111_1 iC_111_1 = const C_111_1();
+closureC_111_1(foo) =>
+    (C_111_1 unused) => iC_111_1.toString() == foo.toString();
+
+class C_010_0 {
+  const C_010_0();
+}
+
+class M_010_0 {}
+
+class T_010_0 {}
+
+const C_010_0 iC_010_0 = const C_010_0();
+closureC_010_0(foo) =>
+    (C_010_0 unused) => iC_010_0.toString() == foo.toString();
+
+class C_010_1 {
+  const C_010_1();
+}
+
+class M_010_1 {}
+
+class T_010_1 {}
+
+const C_010_1 iC_010_1 = const C_010_1();
+closureC_010_1(foo) =>
+    (C_010_1 unused) => iC_010_1.toString() == foo.toString();
+
+class C_011_1 {
+  const C_011_1();
+}
+
+class M_011_1 {}
+
+class T_011_1 {}
+
+const C_011_1 iC_011_1 = const C_011_1();
+closureC_011_1(foo) =>
+    (C_011_1 unused) => iC_011_1.toString() == foo.toString();
+
+class C_001_0 {
+  const C_001_0();
+}
+
+class M_001_0 {}
+
+class T_001_0 {}
+
+const C_001_0 iC_001_0 = const C_001_0();
+closureC_001_0(foo) =>
+    (C_001_0 unused) => iC_001_0.toString() == foo.toString();
+
+class C_000_1 {
+  const C_000_1();
+}
+
+class M_000_1 {}
+
+class T_000_1 {}
+
+const C_000_1 iC_000_1 = const C_000_1();
+closureC_000_1(foo) =>
+    (C_000_1 unused) => iC_000_1.toString() == foo.toString();
+
+class C_110_0_class_1 extends C_100_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements C_110_0, C_101_1, C_111_1, C_010_0, C_010_1, C_011_1 {
+  const C_110_0_class_1();
+}
+
+const C_110_0_class_1 iC_110_0_class_1 = const C_110_0_class_1();
+closureC_110_0_class_1(foo) =>
+    (C_110_0_class_1 unused) => iC_110_0_class_1.toString() == foo.toString();
+
+class T_110_0_type__1 extends T_100_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements T_110_0, T_101_1, T_111_1, T_010_0, T_010_1, T_011_1 {}
+
+class C_110_0_class_2 extends C_110_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements C_100_0, C_101_1, C_111_1, C_010_0, C_010_1, C_011_1 {
+  const C_110_0_class_2();
+}
+
+const C_110_0_class_2 iC_110_0_class_2 = const C_110_0_class_2();
+closureC_110_0_class_2(foo) =>
+    (C_110_0_class_2 unused) => iC_110_0_class_2.toString() == foo.toString();
+
+class T_110_0_type__2 extends T_110_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements T_100_0, T_101_1, T_111_1, T_010_0, T_010_1, T_011_1 {}
+
+class C_110_0_class_3 extends C_101_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements C_100_0, C_110_0, C_111_1, C_010_0, C_010_1, C_011_1 {
+  const C_110_0_class_3();
+}
+
+const C_110_0_class_3 iC_110_0_class_3 = const C_110_0_class_3();
+closureC_110_0_class_3(foo) =>
+    (C_110_0_class_3 unused) => iC_110_0_class_3.toString() == foo.toString();
+
+class T_110_0_type__3 extends T_101_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements T_100_0, T_110_0, T_111_1, T_010_0, T_010_1, T_011_1 {}
+
+class C_110_0_class_4 extends C_111_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements C_100_0, C_110_0, C_101_1, C_010_0, C_010_1, C_011_1 {
+  const C_110_0_class_4();
+}
+
+const C_110_0_class_4 iC_110_0_class_4 = const C_110_0_class_4();
+closureC_110_0_class_4(foo) =>
+    (C_110_0_class_4 unused) => iC_110_0_class_4.toString() == foo.toString();
+
+class T_110_0_type__4 extends T_111_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements T_100_0, T_110_0, T_101_1, T_010_0, T_010_1, T_011_1 {}
+
+class C_110_0_class_5 extends C_010_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements C_100_0, C_110_0, C_101_1, C_111_1, C_010_1, C_011_1 {
+  const C_110_0_class_5();
+}
+
+const C_110_0_class_5 iC_110_0_class_5 = const C_110_0_class_5();
+closureC_110_0_class_5(foo) =>
+    (C_110_0_class_5 unused) => iC_110_0_class_5.toString() == foo.toString();
+
+class T_110_0_type__5 extends T_010_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements T_100_0, T_110_0, T_101_1, T_111_1, T_010_1, T_011_1 {}
+
+class C_110_0_class_6 extends C_010_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements C_100_0, C_110_0, C_101_1, C_111_1, C_010_0, C_011_1 {
+  const C_110_0_class_6();
+}
+
+const C_110_0_class_6 iC_110_0_class_6 = const C_110_0_class_6();
+closureC_110_0_class_6(foo) =>
+    (C_110_0_class_6 unused) => iC_110_0_class_6.toString() == foo.toString();
+
+class T_110_0_type__6 extends T_010_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements T_100_0, T_110_0, T_101_1, T_111_1, T_010_0, T_011_1 {}
+
+class C_110_0_class_7 extends C_011_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements C_100_0, C_110_0, C_101_1, C_111_1, C_010_0, C_010_1 {
+  const C_110_0_class_7();
+}
+
+const C_110_0_class_7 iC_110_0_class_7 = const C_110_0_class_7();
+closureC_110_0_class_7(foo) =>
+    (C_110_0_class_7 unused) => iC_110_0_class_7.toString() == foo.toString();
+
+class T_110_0_type__7 extends T_011_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_010_0, M_010_1, M_011_1
+    implements T_100_0, T_110_0, T_101_1, T_111_1, T_010_0, T_010_1 {}
+
+class C_101_1_class_1 extends C_100_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements C_110_0, C_101_1, C_111_1, C_001_0, C_000_1 {
+  const C_101_1_class_1();
+}
+
+const C_101_1_class_1 iC_101_1_class_1 = const C_101_1_class_1();
+closureC_101_1_class_1(foo) =>
+    (C_101_1_class_1 unused) => iC_101_1_class_1.toString() == foo.toString();
+
+class T_101_1_type__1 extends T_100_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements T_110_0, T_101_1, T_111_1, T_001_0, T_000_1 {}
+
+class C_101_1_class_2 extends C_110_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements C_100_0, C_101_1, C_111_1, C_001_0, C_000_1 {
+  const C_101_1_class_2();
+}
+
+const C_101_1_class_2 iC_101_1_class_2 = const C_101_1_class_2();
+closureC_101_1_class_2(foo) =>
+    (C_101_1_class_2 unused) => iC_101_1_class_2.toString() == foo.toString();
+
+class T_101_1_type__2 extends T_110_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements T_100_0, T_101_1, T_111_1, T_001_0, T_000_1 {}
+
+class C_101_1_class_3 extends C_101_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements C_100_0, C_110_0, C_111_1, C_001_0, C_000_1 {
+  const C_101_1_class_3();
+}
+
+const C_101_1_class_3 iC_101_1_class_3 = const C_101_1_class_3();
+closureC_101_1_class_3(foo) =>
+    (C_101_1_class_3 unused) => iC_101_1_class_3.toString() == foo.toString();
+
+class T_101_1_type__3 extends T_101_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements T_100_0, T_110_0, T_111_1, T_001_0, T_000_1 {}
+
+class C_101_1_class_4 extends C_111_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements C_100_0, C_110_0, C_101_1, C_001_0, C_000_1 {
+  const C_101_1_class_4();
+}
+
+const C_101_1_class_4 iC_101_1_class_4 = const C_101_1_class_4();
+closureC_101_1_class_4(foo) =>
+    (C_101_1_class_4 unused) => iC_101_1_class_4.toString() == foo.toString();
+
+class T_101_1_type__4 extends T_111_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements T_100_0, T_110_0, T_101_1, T_001_0, T_000_1 {}
+
+class C_101_1_class_5 extends C_001_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements C_100_0, C_110_0, C_101_1, C_111_1, C_000_1 {
+  const C_101_1_class_5();
+}
+
+const C_101_1_class_5 iC_101_1_class_5 = const C_101_1_class_5();
+closureC_101_1_class_5(foo) =>
+    (C_101_1_class_5 unused) => iC_101_1_class_5.toString() == foo.toString();
+
+class T_101_1_type__5 extends T_001_0
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements T_100_0, T_110_0, T_101_1, T_111_1, T_000_1 {}
+
+class C_101_1_class_6 extends C_000_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements C_100_0, C_110_0, C_101_1, C_111_1, C_001_0 {
+  const C_101_1_class_6();
+}
+
+const C_101_1_class_6 iC_101_1_class_6 = const C_101_1_class_6();
+closureC_101_1_class_6(foo) =>
+    (C_101_1_class_6 unused) => iC_101_1_class_6.toString() == foo.toString();
+
+class T_101_1_type__6 extends T_000_1
+    with M_100_0, M_110_0, M_101_1, M_111_1, M_001_0, M_000_1
+    implements T_100_0, T_110_0, T_101_1, T_111_1, T_001_0 {}
+
+class C_111_1_class_1 extends C_100_0
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        C_110_0,
+        C_101_1,
+        C_111_1,
+        C_010_0,
+        C_010_1,
+        C_011_1,
+        C_001_0,
+        C_000_1 {
+  const C_111_1_class_1();
+}
+
+const C_111_1_class_1 iC_111_1_class_1 = const C_111_1_class_1();
+closureC_111_1_class_1(foo) =>
+    (C_111_1_class_1 unused) => iC_111_1_class_1.toString() == foo.toString();
+
+class T_111_1_type__1 extends T_100_0
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        T_110_0,
+        T_101_1,
+        T_111_1,
+        T_010_0,
+        T_010_1,
+        T_011_1,
+        T_001_0,
+        T_000_1 {}
+
+class C_111_1_class_2 extends C_110_0
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        C_100_0,
+        C_101_1,
+        C_111_1,
+        C_010_0,
+        C_010_1,
+        C_011_1,
+        C_001_0,
+        C_000_1 {
+  const C_111_1_class_2();
+}
+
+const C_111_1_class_2 iC_111_1_class_2 = const C_111_1_class_2();
+closureC_111_1_class_2(foo) =>
+    (C_111_1_class_2 unused) => iC_111_1_class_2.toString() == foo.toString();
+
+class T_111_1_type__2 extends T_110_0
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        T_100_0,
+        T_101_1,
+        T_111_1,
+        T_010_0,
+        T_010_1,
+        T_011_1,
+        T_001_0,
+        T_000_1 {}
+
+class C_111_1_class_3 extends C_101_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        C_100_0,
+        C_110_0,
+        C_111_1,
+        C_010_0,
+        C_010_1,
+        C_011_1,
+        C_001_0,
+        C_000_1 {
+  const C_111_1_class_3();
+}
+
+const C_111_1_class_3 iC_111_1_class_3 = const C_111_1_class_3();
+closureC_111_1_class_3(foo) =>
+    (C_111_1_class_3 unused) => iC_111_1_class_3.toString() == foo.toString();
+
+class T_111_1_type__3 extends T_101_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        T_100_0,
+        T_110_0,
+        T_111_1,
+        T_010_0,
+        T_010_1,
+        T_011_1,
+        T_001_0,
+        T_000_1 {}
+
+class C_111_1_class_4 extends C_111_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        C_100_0,
+        C_110_0,
+        C_101_1,
+        C_010_0,
+        C_010_1,
+        C_011_1,
+        C_001_0,
+        C_000_1 {
+  const C_111_1_class_4();
+}
+
+const C_111_1_class_4 iC_111_1_class_4 = const C_111_1_class_4();
+closureC_111_1_class_4(foo) =>
+    (C_111_1_class_4 unused) => iC_111_1_class_4.toString() == foo.toString();
+
+class T_111_1_type__4 extends T_111_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        T_100_0,
+        T_110_0,
+        T_101_1,
+        T_010_0,
+        T_010_1,
+        T_011_1,
+        T_001_0,
+        T_000_1 {}
+
+class C_111_1_class_5 extends C_010_0
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        C_100_0,
+        C_110_0,
+        C_101_1,
+        C_111_1,
+        C_010_1,
+        C_011_1,
+        C_001_0,
+        C_000_1 {
+  const C_111_1_class_5();
+}
+
+const C_111_1_class_5 iC_111_1_class_5 = const C_111_1_class_5();
+closureC_111_1_class_5(foo) =>
+    (C_111_1_class_5 unused) => iC_111_1_class_5.toString() == foo.toString();
+
+class T_111_1_type__5 extends T_010_0
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        T_100_0,
+        T_110_0,
+        T_101_1,
+        T_111_1,
+        T_010_1,
+        T_011_1,
+        T_001_0,
+        T_000_1 {}
+
+class C_111_1_class_6 extends C_010_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        C_100_0,
+        C_110_0,
+        C_101_1,
+        C_111_1,
+        C_010_0,
+        C_011_1,
+        C_001_0,
+        C_000_1 {
+  const C_111_1_class_6();
+}
+
+const C_111_1_class_6 iC_111_1_class_6 = const C_111_1_class_6();
+closureC_111_1_class_6(foo) =>
+    (C_111_1_class_6 unused) => iC_111_1_class_6.toString() == foo.toString();
+
+class T_111_1_type__6 extends T_010_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        T_100_0,
+        T_110_0,
+        T_101_1,
+        T_111_1,
+        T_010_0,
+        T_011_1,
+        T_001_0,
+        T_000_1 {}
+
+class C_111_1_class_7 extends C_011_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        C_100_0,
+        C_110_0,
+        C_101_1,
+        C_111_1,
+        C_010_0,
+        C_010_1,
+        C_001_0,
+        C_000_1 {
+  const C_111_1_class_7();
+}
+
+const C_111_1_class_7 iC_111_1_class_7 = const C_111_1_class_7();
+closureC_111_1_class_7(foo) =>
+    (C_111_1_class_7 unused) => iC_111_1_class_7.toString() == foo.toString();
+
+class T_111_1_type__7 extends T_011_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        T_100_0,
+        T_110_0,
+        T_101_1,
+        T_111_1,
+        T_010_0,
+        T_010_1,
+        T_001_0,
+        T_000_1 {}
+
+class C_111_1_class_8 extends C_001_0
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        C_100_0,
+        C_110_0,
+        C_101_1,
+        C_111_1,
+        C_010_0,
+        C_010_1,
+        C_011_1,
+        C_000_1 {
+  const C_111_1_class_8();
+}
+
+const C_111_1_class_8 iC_111_1_class_8 = const C_111_1_class_8();
+closureC_111_1_class_8(foo) =>
+    (C_111_1_class_8 unused) => iC_111_1_class_8.toString() == foo.toString();
+
+class T_111_1_type__8 extends T_001_0
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        T_100_0,
+        T_110_0,
+        T_101_1,
+        T_111_1,
+        T_010_0,
+        T_010_1,
+        T_011_1,
+        T_000_1 {}
+
+class C_111_1_class_9 extends C_000_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        C_100_0,
+        C_110_0,
+        C_101_1,
+        C_111_1,
+        C_010_0,
+        C_010_1,
+        C_011_1,
+        C_001_0 {
+  const C_111_1_class_9();
+}
+
+const C_111_1_class_9 iC_111_1_class_9 = const C_111_1_class_9();
+closureC_111_1_class_9(foo) =>
+    (C_111_1_class_9 unused) => iC_111_1_class_9.toString() == foo.toString();
+
+class T_111_1_type__9 extends T_000_1
+    with
+        M_100_0,
+        M_110_0,
+        M_101_1,
+        M_111_1,
+        M_010_0,
+        M_010_1,
+        M_011_1,
+        M_001_0,
+        M_000_1
+    implements
+        T_100_0,
+        T_110_0,
+        T_101_1,
+        T_111_1,
+        T_010_0,
+        T_010_1,
+        T_011_1,
+        T_001_0 {}
+
+class C_010_1_class_1 extends C_010_0
+    with M_010_0, M_010_1, M_011_1, M_000_1
+    implements C_010_1, C_011_1, C_000_1 {
+  const C_010_1_class_1();
+}
+
+const C_010_1_class_1 iC_010_1_class_1 = const C_010_1_class_1();
+closureC_010_1_class_1(foo) =>
+    (C_010_1_class_1 unused) => iC_010_1_class_1.toString() == foo.toString();
+
+class T_010_1_type__1 extends T_010_0
+    with M_010_0, M_010_1, M_011_1, M_000_1
+    implements T_010_1, T_011_1, T_000_1 {}
+
+class C_010_1_class_2 extends C_010_1
+    with M_010_0, M_010_1, M_011_1, M_000_1
+    implements C_010_0, C_011_1, C_000_1 {
+  const C_010_1_class_2();
+}
+
+const C_010_1_class_2 iC_010_1_class_2 = const C_010_1_class_2();
+closureC_010_1_class_2(foo) =>
+    (C_010_1_class_2 unused) => iC_010_1_class_2.toString() == foo.toString();
+
+class T_010_1_type__2 extends T_010_1
+    with M_010_0, M_010_1, M_011_1, M_000_1
+    implements T_010_0, T_011_1, T_000_1 {}
+
+class C_010_1_class_3 extends C_011_1
+    with M_010_0, M_010_1, M_011_1, M_000_1
+    implements C_010_0, C_010_1, C_000_1 {
+  const C_010_1_class_3();
+}
+
+const C_010_1_class_3 iC_010_1_class_3 = const C_010_1_class_3();
+closureC_010_1_class_3(foo) =>
+    (C_010_1_class_3 unused) => iC_010_1_class_3.toString() == foo.toString();
+
+class T_010_1_type__3 extends T_011_1
+    with M_010_0, M_010_1, M_011_1, M_000_1
+    implements T_010_0, T_010_1, T_000_1 {}
+
+class C_010_1_class_4 extends C_000_1
+    with M_010_0, M_010_1, M_011_1, M_000_1
+    implements C_010_0, C_010_1, C_011_1 {
+  const C_010_1_class_4();
+}
+
+const C_010_1_class_4 iC_010_1_class_4 = const C_010_1_class_4();
+closureC_010_1_class_4(foo) =>
+    (C_010_1_class_4 unused) => iC_010_1_class_4.toString() == foo.toString();
+
+class T_010_1_type__4 extends T_000_1
+    with M_010_0, M_010_1, M_011_1, M_000_1
+    implements T_010_0, T_010_1, T_011_1 {}
+
+class C_011_1_class_1 extends C_010_0
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements C_010_1, C_011_1, C_001_0, C_000_1 {
+  const C_011_1_class_1();
+}
+
+const C_011_1_class_1 iC_011_1_class_1 = const C_011_1_class_1();
+closureC_011_1_class_1(foo) =>
+    (C_011_1_class_1 unused) => iC_011_1_class_1.toString() == foo.toString();
+
+class T_011_1_type__1 extends T_010_0
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements T_010_1, T_011_1, T_001_0, T_000_1 {}
+
+class C_011_1_class_2 extends C_010_1
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements C_010_0, C_011_1, C_001_0, C_000_1 {
+  const C_011_1_class_2();
+}
+
+const C_011_1_class_2 iC_011_1_class_2 = const C_011_1_class_2();
+closureC_011_1_class_2(foo) =>
+    (C_011_1_class_2 unused) => iC_011_1_class_2.toString() == foo.toString();
+
+class T_011_1_type__2 extends T_010_1
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements T_010_0, T_011_1, T_001_0, T_000_1 {}
+
+class C_011_1_class_3 extends C_011_1
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements C_010_0, C_010_1, C_001_0, C_000_1 {
+  const C_011_1_class_3();
+}
+
+const C_011_1_class_3 iC_011_1_class_3 = const C_011_1_class_3();
+closureC_011_1_class_3(foo) =>
+    (C_011_1_class_3 unused) => iC_011_1_class_3.toString() == foo.toString();
+
+class T_011_1_type__3 extends T_011_1
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements T_010_0, T_010_1, T_001_0, T_000_1 {}
+
+class C_011_1_class_4 extends C_001_0
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements C_010_0, C_010_1, C_011_1, C_000_1 {
+  const C_011_1_class_4();
+}
+
+const C_011_1_class_4 iC_011_1_class_4 = const C_011_1_class_4();
+closureC_011_1_class_4(foo) =>
+    (C_011_1_class_4 unused) => iC_011_1_class_4.toString() == foo.toString();
+
+class T_011_1_type__4 extends T_001_0
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements T_010_0, T_010_1, T_011_1, T_000_1 {}
+
+class C_011_1_class_5 extends C_000_1
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements C_010_0, C_010_1, C_011_1, C_001_0 {
+  const C_011_1_class_5();
+}
+
+const C_011_1_class_5 iC_011_1_class_5 = const C_011_1_class_5();
+closureC_011_1_class_5(foo) =>
+    (C_011_1_class_5 unused) => iC_011_1_class_5.toString() == foo.toString();
+
+class T_011_1_type__5 extends T_000_1
+    with M_010_0, M_010_1, M_011_1, M_001_0, M_000_1
+    implements T_010_0, T_010_1, T_011_1, T_001_0 {}
+
 @pragma('dart2js:noInline')
 f_100_0(Set<String> u, int b) => v(u, '1000', b);
 @pragma('dart2js:noInline')
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_000_1.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_000_1.dart
index 37a1c2e..c67496e 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_000_1.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_000_1.dart
@@ -3,13 +3,220 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import "package:expect/expect.dart";
 
 import 'libImport.dart';
 
 @pragma('dart2js:noInline')
+typeTest(dynamic t) {
+  if (t is T_000_1) {
+    return true;
+  }
+  if (t is T_101_1_type__1) {
+    return true;
+  }
+  if (t is T_101_1_type__2) {
+    return true;
+  }
+  if (t is T_101_1_type__3) {
+    return true;
+  }
+  if (t is T_101_1_type__4) {
+    return true;
+  }
+  if (t is T_101_1_type__5) {
+    return true;
+  }
+  if (t is T_101_1_type__6) {
+    return true;
+  }
+  if (t is T_111_1_type__1) {
+    return true;
+  }
+  if (t is T_111_1_type__2) {
+    return true;
+  }
+  if (t is T_111_1_type__3) {
+    return true;
+  }
+  if (t is T_111_1_type__4) {
+    return true;
+  }
+  if (t is T_111_1_type__5) {
+    return true;
+  }
+  if (t is T_111_1_type__6) {
+    return true;
+  }
+  if (t is T_111_1_type__7) {
+    return true;
+  }
+  if (t is T_111_1_type__8) {
+    return true;
+  }
+  if (t is T_111_1_type__9) {
+    return true;
+  }
+  if (t is T_010_1_type__1) {
+    return true;
+  }
+  if (t is T_010_1_type__2) {
+    return true;
+  }
+  if (t is T_010_1_type__3) {
+    return true;
+  }
+  if (t is T_010_1_type__4) {
+    return true;
+  }
+  if (t is T_011_1_type__1) {
+    return true;
+  }
+  if (t is T_011_1_type__2) {
+    return true;
+  }
+  if (t is T_011_1_type__3) {
+    return true;
+  }
+  if (t is T_011_1_type__4) {
+    return true;
+  }
+  if (t is T_011_1_type__5) {
+    return true;
+  }
+  return false;
+}
+
+@pragma('dart2js:noInline')
 g_000_1() {
+  // C_***_1;
+  Expect.isFalse(typeTest(C_000_1()));
+  Expect.isFalse(typeTest(C_101_1_class_1()));
+  Expect.isFalse(typeTest(C_101_1_class_2()));
+  Expect.isFalse(typeTest(C_101_1_class_3()));
+  Expect.isFalse(typeTest(C_101_1_class_4()));
+  Expect.isFalse(typeTest(C_101_1_class_5()));
+  Expect.isFalse(typeTest(C_101_1_class_6()));
+  Expect.isFalse(typeTest(C_111_1_class_1()));
+  Expect.isFalse(typeTest(C_111_1_class_2()));
+  Expect.isFalse(typeTest(C_111_1_class_3()));
+  Expect.isFalse(typeTest(C_111_1_class_4()));
+  Expect.isFalse(typeTest(C_111_1_class_5()));
+  Expect.isFalse(typeTest(C_111_1_class_6()));
+  Expect.isFalse(typeTest(C_111_1_class_7()));
+  Expect.isFalse(typeTest(C_111_1_class_8()));
+  Expect.isFalse(typeTest(C_111_1_class_9()));
+  Expect.isFalse(typeTest(C_010_1_class_1()));
+  Expect.isFalse(typeTest(C_010_1_class_2()));
+  Expect.isFalse(typeTest(C_010_1_class_3()));
+  Expect.isFalse(typeTest(C_010_1_class_4()));
+  Expect.isFalse(typeTest(C_011_1_class_1()));
+  Expect.isFalse(typeTest(C_011_1_class_2()));
+  Expect.isFalse(typeTest(C_011_1_class_3()));
+  Expect.isFalse(typeTest(C_011_1_class_4()));
+  Expect.isFalse(typeTest(C_011_1_class_5()));
+
+  Expect.isTrue(closureC_000_1(C_000_1())(C_000_1()));
+  Expect.isTrue(closureC_101_1_class_1(C_101_1_class_1())(C_101_1_class_1()));
+  Expect.isTrue(closureC_101_1_class_2(C_101_1_class_2())(C_101_1_class_2()));
+  Expect.isTrue(closureC_101_1_class_3(C_101_1_class_3())(C_101_1_class_3()));
+  Expect.isTrue(closureC_101_1_class_4(C_101_1_class_4())(C_101_1_class_4()));
+  Expect.isTrue(closureC_101_1_class_5(C_101_1_class_5())(C_101_1_class_5()));
+  Expect.isTrue(closureC_101_1_class_6(C_101_1_class_6())(C_101_1_class_6()));
+  Expect.isTrue(closureC_111_1_class_1(C_111_1_class_1())(C_111_1_class_1()));
+  Expect.isTrue(closureC_111_1_class_2(C_111_1_class_2())(C_111_1_class_2()));
+  Expect.isTrue(closureC_111_1_class_3(C_111_1_class_3())(C_111_1_class_3()));
+  Expect.isTrue(closureC_111_1_class_4(C_111_1_class_4())(C_111_1_class_4()));
+  Expect.isTrue(closureC_111_1_class_5(C_111_1_class_5())(C_111_1_class_5()));
+  Expect.isTrue(closureC_111_1_class_6(C_111_1_class_6())(C_111_1_class_6()));
+  Expect.isTrue(closureC_111_1_class_7(C_111_1_class_7())(C_111_1_class_7()));
+  Expect.isTrue(closureC_111_1_class_8(C_111_1_class_8())(C_111_1_class_8()));
+  Expect.isTrue(closureC_111_1_class_9(C_111_1_class_9())(C_111_1_class_9()));
+  Expect.isTrue(closureC_010_1_class_1(C_010_1_class_1())(C_010_1_class_1()));
+  Expect.isTrue(closureC_010_1_class_2(C_010_1_class_2())(C_010_1_class_2()));
+  Expect.isTrue(closureC_010_1_class_3(C_010_1_class_3())(C_010_1_class_3()));
+  Expect.isTrue(closureC_010_1_class_4(C_010_1_class_4())(C_010_1_class_4()));
+  Expect.isTrue(closureC_011_1_class_1(C_011_1_class_1())(C_011_1_class_1()));
+  Expect.isTrue(closureC_011_1_class_2(C_011_1_class_2())(C_011_1_class_2()));
+  Expect.isTrue(closureC_011_1_class_3(C_011_1_class_3())(C_011_1_class_3()));
+  Expect.isTrue(closureC_011_1_class_4(C_011_1_class_4())(C_011_1_class_4()));
+  Expect.isTrue(closureC_011_1_class_5(C_011_1_class_5())(C_011_1_class_5()));
+
+  Expect.equals(
+      closureC_000_1(C_000_1()).runtimeType.toString(), '(C_000_1) => bool');
+  Expect.equals(
+      closureC_101_1_class_1(C_101_1_class_1()).runtimeType.toString(),
+      '(C_101_1_class_1) => bool');
+  Expect.equals(
+      closureC_101_1_class_2(C_101_1_class_2()).runtimeType.toString(),
+      '(C_101_1_class_2) => bool');
+  Expect.equals(
+      closureC_101_1_class_3(C_101_1_class_3()).runtimeType.toString(),
+      '(C_101_1_class_3) => bool');
+  Expect.equals(
+      closureC_101_1_class_4(C_101_1_class_4()).runtimeType.toString(),
+      '(C_101_1_class_4) => bool');
+  Expect.equals(
+      closureC_101_1_class_5(C_101_1_class_5()).runtimeType.toString(),
+      '(C_101_1_class_5) => bool');
+  Expect.equals(
+      closureC_101_1_class_6(C_101_1_class_6()).runtimeType.toString(),
+      '(C_101_1_class_6) => bool');
+  Expect.equals(
+      closureC_111_1_class_1(C_111_1_class_1()).runtimeType.toString(),
+      '(C_111_1_class_1) => bool');
+  Expect.equals(
+      closureC_111_1_class_2(C_111_1_class_2()).runtimeType.toString(),
+      '(C_111_1_class_2) => bool');
+  Expect.equals(
+      closureC_111_1_class_3(C_111_1_class_3()).runtimeType.toString(),
+      '(C_111_1_class_3) => bool');
+  Expect.equals(
+      closureC_111_1_class_4(C_111_1_class_4()).runtimeType.toString(),
+      '(C_111_1_class_4) => bool');
+  Expect.equals(
+      closureC_111_1_class_5(C_111_1_class_5()).runtimeType.toString(),
+      '(C_111_1_class_5) => bool');
+  Expect.equals(
+      closureC_111_1_class_6(C_111_1_class_6()).runtimeType.toString(),
+      '(C_111_1_class_6) => bool');
+  Expect.equals(
+      closureC_111_1_class_7(C_111_1_class_7()).runtimeType.toString(),
+      '(C_111_1_class_7) => bool');
+  Expect.equals(
+      closureC_111_1_class_8(C_111_1_class_8()).runtimeType.toString(),
+      '(C_111_1_class_8) => bool');
+  Expect.equals(
+      closureC_111_1_class_9(C_111_1_class_9()).runtimeType.toString(),
+      '(C_111_1_class_9) => bool');
+  Expect.equals(
+      closureC_010_1_class_1(C_010_1_class_1()).runtimeType.toString(),
+      '(C_010_1_class_1) => bool');
+  Expect.equals(
+      closureC_010_1_class_2(C_010_1_class_2()).runtimeType.toString(),
+      '(C_010_1_class_2) => bool');
+  Expect.equals(
+      closureC_010_1_class_3(C_010_1_class_3()).runtimeType.toString(),
+      '(C_010_1_class_3) => bool');
+  Expect.equals(
+      closureC_010_1_class_4(C_010_1_class_4()).runtimeType.toString(),
+      '(C_010_1_class_4) => bool');
+  Expect.equals(
+      closureC_011_1_class_1(C_011_1_class_1()).runtimeType.toString(),
+      '(C_011_1_class_1) => bool');
+  Expect.equals(
+      closureC_011_1_class_2(C_011_1_class_2()).runtimeType.toString(),
+      '(C_011_1_class_2) => bool');
+  Expect.equals(
+      closureC_011_1_class_3(C_011_1_class_3()).runtimeType.toString(),
+      '(C_011_1_class_3) => bool');
+  Expect.equals(
+      closureC_011_1_class_4(C_011_1_class_4()).runtimeType.toString(),
+      '(C_011_1_class_4) => bool');
+  Expect.equals(
+      closureC_011_1_class_5(C_011_1_class_5()).runtimeType.toString(),
+      '(C_011_1_class_5) => bool');
+
   Set<String> uniques = {};
 
   // f_***_1;
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_001_0.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_001_0.dart
index 3534e43..93b13b2 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_001_0.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_001_0.dart
@@ -3,13 +3,188 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import "package:expect/expect.dart";
 
 import 'libImport.dart';
 
 @pragma('dart2js:noInline')
+typeTest(dynamic t) {
+  if (t is T_001_0) {
+    return true;
+  }
+  if (t is T_101_1_type__1) {
+    return true;
+  }
+  if (t is T_101_1_type__2) {
+    return true;
+  }
+  if (t is T_101_1_type__3) {
+    return true;
+  }
+  if (t is T_101_1_type__4) {
+    return true;
+  }
+  if (t is T_101_1_type__5) {
+    return true;
+  }
+  if (t is T_101_1_type__6) {
+    return true;
+  }
+  if (t is T_111_1_type__1) {
+    return true;
+  }
+  if (t is T_111_1_type__2) {
+    return true;
+  }
+  if (t is T_111_1_type__3) {
+    return true;
+  }
+  if (t is T_111_1_type__4) {
+    return true;
+  }
+  if (t is T_111_1_type__5) {
+    return true;
+  }
+  if (t is T_111_1_type__6) {
+    return true;
+  }
+  if (t is T_111_1_type__7) {
+    return true;
+  }
+  if (t is T_111_1_type__8) {
+    return true;
+  }
+  if (t is T_111_1_type__9) {
+    return true;
+  }
+  if (t is T_011_1_type__1) {
+    return true;
+  }
+  if (t is T_011_1_type__2) {
+    return true;
+  }
+  if (t is T_011_1_type__3) {
+    return true;
+  }
+  if (t is T_011_1_type__4) {
+    return true;
+  }
+  if (t is T_011_1_type__5) {
+    return true;
+  }
+  return false;
+}
+
+@pragma('dart2js:noInline')
 g_001_0() {
+  // C_**1_*;
+  Expect.isFalse(typeTest(C_001_0()));
+  Expect.isFalse(typeTest(C_101_1_class_1()));
+  Expect.isFalse(typeTest(C_101_1_class_2()));
+  Expect.isFalse(typeTest(C_101_1_class_3()));
+  Expect.isFalse(typeTest(C_101_1_class_4()));
+  Expect.isFalse(typeTest(C_101_1_class_5()));
+  Expect.isFalse(typeTest(C_101_1_class_6()));
+  Expect.isFalse(typeTest(C_111_1_class_1()));
+  Expect.isFalse(typeTest(C_111_1_class_2()));
+  Expect.isFalse(typeTest(C_111_1_class_3()));
+  Expect.isFalse(typeTest(C_111_1_class_4()));
+  Expect.isFalse(typeTest(C_111_1_class_5()));
+  Expect.isFalse(typeTest(C_111_1_class_6()));
+  Expect.isFalse(typeTest(C_111_1_class_7()));
+  Expect.isFalse(typeTest(C_111_1_class_8()));
+  Expect.isFalse(typeTest(C_111_1_class_9()));
+  Expect.isFalse(typeTest(C_011_1_class_1()));
+  Expect.isFalse(typeTest(C_011_1_class_2()));
+  Expect.isFalse(typeTest(C_011_1_class_3()));
+  Expect.isFalse(typeTest(C_011_1_class_4()));
+  Expect.isFalse(typeTest(C_011_1_class_5()));
+
+  Expect.isTrue(closureC_001_0(C_001_0())(C_001_0()));
+  Expect.isTrue(closureC_101_1_class_1(C_101_1_class_1())(C_101_1_class_1()));
+  Expect.isTrue(closureC_101_1_class_2(C_101_1_class_2())(C_101_1_class_2()));
+  Expect.isTrue(closureC_101_1_class_3(C_101_1_class_3())(C_101_1_class_3()));
+  Expect.isTrue(closureC_101_1_class_4(C_101_1_class_4())(C_101_1_class_4()));
+  Expect.isTrue(closureC_101_1_class_5(C_101_1_class_5())(C_101_1_class_5()));
+  Expect.isTrue(closureC_101_1_class_6(C_101_1_class_6())(C_101_1_class_6()));
+  Expect.isTrue(closureC_111_1_class_1(C_111_1_class_1())(C_111_1_class_1()));
+  Expect.isTrue(closureC_111_1_class_2(C_111_1_class_2())(C_111_1_class_2()));
+  Expect.isTrue(closureC_111_1_class_3(C_111_1_class_3())(C_111_1_class_3()));
+  Expect.isTrue(closureC_111_1_class_4(C_111_1_class_4())(C_111_1_class_4()));
+  Expect.isTrue(closureC_111_1_class_5(C_111_1_class_5())(C_111_1_class_5()));
+  Expect.isTrue(closureC_111_1_class_6(C_111_1_class_6())(C_111_1_class_6()));
+  Expect.isTrue(closureC_111_1_class_7(C_111_1_class_7())(C_111_1_class_7()));
+  Expect.isTrue(closureC_111_1_class_8(C_111_1_class_8())(C_111_1_class_8()));
+  Expect.isTrue(closureC_111_1_class_9(C_111_1_class_9())(C_111_1_class_9()));
+  Expect.isTrue(closureC_011_1_class_1(C_011_1_class_1())(C_011_1_class_1()));
+  Expect.isTrue(closureC_011_1_class_2(C_011_1_class_2())(C_011_1_class_2()));
+  Expect.isTrue(closureC_011_1_class_3(C_011_1_class_3())(C_011_1_class_3()));
+  Expect.isTrue(closureC_011_1_class_4(C_011_1_class_4())(C_011_1_class_4()));
+  Expect.isTrue(closureC_011_1_class_5(C_011_1_class_5())(C_011_1_class_5()));
+
+  Expect.equals(
+      closureC_001_0(C_001_0()).runtimeType.toString(), '(C_001_0) => bool');
+  Expect.equals(
+      closureC_101_1_class_1(C_101_1_class_1()).runtimeType.toString(),
+      '(C_101_1_class_1) => bool');
+  Expect.equals(
+      closureC_101_1_class_2(C_101_1_class_2()).runtimeType.toString(),
+      '(C_101_1_class_2) => bool');
+  Expect.equals(
+      closureC_101_1_class_3(C_101_1_class_3()).runtimeType.toString(),
+      '(C_101_1_class_3) => bool');
+  Expect.equals(
+      closureC_101_1_class_4(C_101_1_class_4()).runtimeType.toString(),
+      '(C_101_1_class_4) => bool');
+  Expect.equals(
+      closureC_101_1_class_5(C_101_1_class_5()).runtimeType.toString(),
+      '(C_101_1_class_5) => bool');
+  Expect.equals(
+      closureC_101_1_class_6(C_101_1_class_6()).runtimeType.toString(),
+      '(C_101_1_class_6) => bool');
+  Expect.equals(
+      closureC_111_1_class_1(C_111_1_class_1()).runtimeType.toString(),
+      '(C_111_1_class_1) => bool');
+  Expect.equals(
+      closureC_111_1_class_2(C_111_1_class_2()).runtimeType.toString(),
+      '(C_111_1_class_2) => bool');
+  Expect.equals(
+      closureC_111_1_class_3(C_111_1_class_3()).runtimeType.toString(),
+      '(C_111_1_class_3) => bool');
+  Expect.equals(
+      closureC_111_1_class_4(C_111_1_class_4()).runtimeType.toString(),
+      '(C_111_1_class_4) => bool');
+  Expect.equals(
+      closureC_111_1_class_5(C_111_1_class_5()).runtimeType.toString(),
+      '(C_111_1_class_5) => bool');
+  Expect.equals(
+      closureC_111_1_class_6(C_111_1_class_6()).runtimeType.toString(),
+      '(C_111_1_class_6) => bool');
+  Expect.equals(
+      closureC_111_1_class_7(C_111_1_class_7()).runtimeType.toString(),
+      '(C_111_1_class_7) => bool');
+  Expect.equals(
+      closureC_111_1_class_8(C_111_1_class_8()).runtimeType.toString(),
+      '(C_111_1_class_8) => bool');
+  Expect.equals(
+      closureC_111_1_class_9(C_111_1_class_9()).runtimeType.toString(),
+      '(C_111_1_class_9) => bool');
+  Expect.equals(
+      closureC_011_1_class_1(C_011_1_class_1()).runtimeType.toString(),
+      '(C_011_1_class_1) => bool');
+  Expect.equals(
+      closureC_011_1_class_2(C_011_1_class_2()).runtimeType.toString(),
+      '(C_011_1_class_2) => bool');
+  Expect.equals(
+      closureC_011_1_class_3(C_011_1_class_3()).runtimeType.toString(),
+      '(C_011_1_class_3) => bool');
+  Expect.equals(
+      closureC_011_1_class_4(C_011_1_class_4()).runtimeType.toString(),
+      '(C_011_1_class_4) => bool');
+  Expect.equals(
+      closureC_011_1_class_5(C_011_1_class_5()).runtimeType.toString(),
+      '(C_011_1_class_5) => bool');
+
   Set<String> uniques = {};
 
   // f_**1_*;
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_010_0.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_010_0.dart
index d9ef060..600809f 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_010_0.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_010_0.dart
@@ -3,13 +3,242 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import "package:expect/expect.dart";
 
 import 'libImport.dart';
 
 @pragma('dart2js:noInline')
+typeTest(dynamic t) {
+  if (t is T_010_0) {
+    return true;
+  }
+  if (t is T_010_1) {
+    return true;
+  }
+  if (t is T_011_1) {
+    return true;
+  }
+  if (t is T_110_0_type__1) {
+    return true;
+  }
+  if (t is T_110_0_type__2) {
+    return true;
+  }
+  if (t is T_110_0_type__3) {
+    return true;
+  }
+  if (t is T_110_0_type__4) {
+    return true;
+  }
+  if (t is T_110_0_type__5) {
+    return true;
+  }
+  if (t is T_110_0_type__6) {
+    return true;
+  }
+  if (t is T_110_0_type__7) {
+    return true;
+  }
+  if (t is T_111_1_type__1) {
+    return true;
+  }
+  if (t is T_111_1_type__2) {
+    return true;
+  }
+  if (t is T_111_1_type__3) {
+    return true;
+  }
+  if (t is T_111_1_type__4) {
+    return true;
+  }
+  if (t is T_111_1_type__5) {
+    return true;
+  }
+  if (t is T_111_1_type__6) {
+    return true;
+  }
+  if (t is T_111_1_type__7) {
+    return true;
+  }
+  if (t is T_111_1_type__8) {
+    return true;
+  }
+  if (t is T_111_1_type__9) {
+    return true;
+  }
+  if (t is T_010_1_type__1) {
+    return true;
+  }
+  if (t is T_010_1_type__2) {
+    return true;
+  }
+  if (t is T_010_1_type__3) {
+    return true;
+  }
+  if (t is T_010_1_type__4) {
+    return true;
+  }
+  if (t is T_011_1_type__1) {
+    return true;
+  }
+  if (t is T_011_1_type__2) {
+    return true;
+  }
+  if (t is T_011_1_type__3) {
+    return true;
+  }
+  if (t is T_011_1_type__4) {
+    return true;
+  }
+  if (t is T_011_1_type__5) {
+    return true;
+  }
+  return false;
+}
+
+@pragma('dart2js:noInline')
 g_010_0() {
+  // C_*1*_*;
+  Expect.isFalse(typeTest(C_010_0()));
+  Expect.isFalse(typeTest(C_010_1()));
+  Expect.isFalse(typeTest(C_011_1()));
+  Expect.isFalse(typeTest(C_110_0_class_1()));
+  Expect.isFalse(typeTest(C_110_0_class_2()));
+  Expect.isFalse(typeTest(C_110_0_class_3()));
+  Expect.isFalse(typeTest(C_110_0_class_4()));
+  Expect.isFalse(typeTest(C_110_0_class_5()));
+  Expect.isFalse(typeTest(C_110_0_class_6()));
+  Expect.isFalse(typeTest(C_110_0_class_7()));
+  Expect.isFalse(typeTest(C_111_1_class_1()));
+  Expect.isFalse(typeTest(C_111_1_class_2()));
+  Expect.isFalse(typeTest(C_111_1_class_3()));
+  Expect.isFalse(typeTest(C_111_1_class_4()));
+  Expect.isFalse(typeTest(C_111_1_class_5()));
+  Expect.isFalse(typeTest(C_111_1_class_6()));
+  Expect.isFalse(typeTest(C_111_1_class_7()));
+  Expect.isFalse(typeTest(C_111_1_class_8()));
+  Expect.isFalse(typeTest(C_111_1_class_9()));
+  Expect.isFalse(typeTest(C_010_1_class_1()));
+  Expect.isFalse(typeTest(C_010_1_class_2()));
+  Expect.isFalse(typeTest(C_010_1_class_3()));
+  Expect.isFalse(typeTest(C_010_1_class_4()));
+  Expect.isFalse(typeTest(C_011_1_class_1()));
+  Expect.isFalse(typeTest(C_011_1_class_2()));
+  Expect.isFalse(typeTest(C_011_1_class_3()));
+  Expect.isFalse(typeTest(C_011_1_class_4()));
+  Expect.isFalse(typeTest(C_011_1_class_5()));
+
+  Expect.isTrue(closureC_010_0(C_010_0())(C_010_0()));
+  Expect.isTrue(closureC_010_1(C_010_1())(C_010_1()));
+  Expect.isTrue(closureC_011_1(C_011_1())(C_011_1()));
+  Expect.isTrue(closureC_110_0_class_1(C_110_0_class_1())(C_110_0_class_1()));
+  Expect.isTrue(closureC_110_0_class_2(C_110_0_class_2())(C_110_0_class_2()));
+  Expect.isTrue(closureC_110_0_class_3(C_110_0_class_3())(C_110_0_class_3()));
+  Expect.isTrue(closureC_110_0_class_4(C_110_0_class_4())(C_110_0_class_4()));
+  Expect.isTrue(closureC_110_0_class_5(C_110_0_class_5())(C_110_0_class_5()));
+  Expect.isTrue(closureC_110_0_class_6(C_110_0_class_6())(C_110_0_class_6()));
+  Expect.isTrue(closureC_110_0_class_7(C_110_0_class_7())(C_110_0_class_7()));
+  Expect.isTrue(closureC_111_1_class_1(C_111_1_class_1())(C_111_1_class_1()));
+  Expect.isTrue(closureC_111_1_class_2(C_111_1_class_2())(C_111_1_class_2()));
+  Expect.isTrue(closureC_111_1_class_3(C_111_1_class_3())(C_111_1_class_3()));
+  Expect.isTrue(closureC_111_1_class_4(C_111_1_class_4())(C_111_1_class_4()));
+  Expect.isTrue(closureC_111_1_class_5(C_111_1_class_5())(C_111_1_class_5()));
+  Expect.isTrue(closureC_111_1_class_6(C_111_1_class_6())(C_111_1_class_6()));
+  Expect.isTrue(closureC_111_1_class_7(C_111_1_class_7())(C_111_1_class_7()));
+  Expect.isTrue(closureC_111_1_class_8(C_111_1_class_8())(C_111_1_class_8()));
+  Expect.isTrue(closureC_111_1_class_9(C_111_1_class_9())(C_111_1_class_9()));
+  Expect.isTrue(closureC_010_1_class_1(C_010_1_class_1())(C_010_1_class_1()));
+  Expect.isTrue(closureC_010_1_class_2(C_010_1_class_2())(C_010_1_class_2()));
+  Expect.isTrue(closureC_010_1_class_3(C_010_1_class_3())(C_010_1_class_3()));
+  Expect.isTrue(closureC_010_1_class_4(C_010_1_class_4())(C_010_1_class_4()));
+  Expect.isTrue(closureC_011_1_class_1(C_011_1_class_1())(C_011_1_class_1()));
+  Expect.isTrue(closureC_011_1_class_2(C_011_1_class_2())(C_011_1_class_2()));
+  Expect.isTrue(closureC_011_1_class_3(C_011_1_class_3())(C_011_1_class_3()));
+  Expect.isTrue(closureC_011_1_class_4(C_011_1_class_4())(C_011_1_class_4()));
+  Expect.isTrue(closureC_011_1_class_5(C_011_1_class_5())(C_011_1_class_5()));
+
+  Expect.equals(
+      closureC_010_0(C_010_0()).runtimeType.toString(), '(C_010_0) => bool');
+  Expect.equals(
+      closureC_010_1(C_010_1()).runtimeType.toString(), '(C_010_1) => bool');
+  Expect.equals(
+      closureC_011_1(C_011_1()).runtimeType.toString(), '(C_011_1) => bool');
+  Expect.equals(
+      closureC_110_0_class_1(C_110_0_class_1()).runtimeType.toString(),
+      '(C_110_0_class_1) => bool');
+  Expect.equals(
+      closureC_110_0_class_2(C_110_0_class_2()).runtimeType.toString(),
+      '(C_110_0_class_2) => bool');
+  Expect.equals(
+      closureC_110_0_class_3(C_110_0_class_3()).runtimeType.toString(),
+      '(C_110_0_class_3) => bool');
+  Expect.equals(
+      closureC_110_0_class_4(C_110_0_class_4()).runtimeType.toString(),
+      '(C_110_0_class_4) => bool');
+  Expect.equals(
+      closureC_110_0_class_5(C_110_0_class_5()).runtimeType.toString(),
+      '(C_110_0_class_5) => bool');
+  Expect.equals(
+      closureC_110_0_class_6(C_110_0_class_6()).runtimeType.toString(),
+      '(C_110_0_class_6) => bool');
+  Expect.equals(
+      closureC_110_0_class_7(C_110_0_class_7()).runtimeType.toString(),
+      '(C_110_0_class_7) => bool');
+  Expect.equals(
+      closureC_111_1_class_1(C_111_1_class_1()).runtimeType.toString(),
+      '(C_111_1_class_1) => bool');
+  Expect.equals(
+      closureC_111_1_class_2(C_111_1_class_2()).runtimeType.toString(),
+      '(C_111_1_class_2) => bool');
+  Expect.equals(
+      closureC_111_1_class_3(C_111_1_class_3()).runtimeType.toString(),
+      '(C_111_1_class_3) => bool');
+  Expect.equals(
+      closureC_111_1_class_4(C_111_1_class_4()).runtimeType.toString(),
+      '(C_111_1_class_4) => bool');
+  Expect.equals(
+      closureC_111_1_class_5(C_111_1_class_5()).runtimeType.toString(),
+      '(C_111_1_class_5) => bool');
+  Expect.equals(
+      closureC_111_1_class_6(C_111_1_class_6()).runtimeType.toString(),
+      '(C_111_1_class_6) => bool');
+  Expect.equals(
+      closureC_111_1_class_7(C_111_1_class_7()).runtimeType.toString(),
+      '(C_111_1_class_7) => bool');
+  Expect.equals(
+      closureC_111_1_class_8(C_111_1_class_8()).runtimeType.toString(),
+      '(C_111_1_class_8) => bool');
+  Expect.equals(
+      closureC_111_1_class_9(C_111_1_class_9()).runtimeType.toString(),
+      '(C_111_1_class_9) => bool');
+  Expect.equals(
+      closureC_010_1_class_1(C_010_1_class_1()).runtimeType.toString(),
+      '(C_010_1_class_1) => bool');
+  Expect.equals(
+      closureC_010_1_class_2(C_010_1_class_2()).runtimeType.toString(),
+      '(C_010_1_class_2) => bool');
+  Expect.equals(
+      closureC_010_1_class_3(C_010_1_class_3()).runtimeType.toString(),
+      '(C_010_1_class_3) => bool');
+  Expect.equals(
+      closureC_010_1_class_4(C_010_1_class_4()).runtimeType.toString(),
+      '(C_010_1_class_4) => bool');
+  Expect.equals(
+      closureC_011_1_class_1(C_011_1_class_1()).runtimeType.toString(),
+      '(C_011_1_class_1) => bool');
+  Expect.equals(
+      closureC_011_1_class_2(C_011_1_class_2()).runtimeType.toString(),
+      '(C_011_1_class_2) => bool');
+  Expect.equals(
+      closureC_011_1_class_3(C_011_1_class_3()).runtimeType.toString(),
+      '(C_011_1_class_3) => bool');
+  Expect.equals(
+      closureC_011_1_class_4(C_011_1_class_4()).runtimeType.toString(),
+      '(C_011_1_class_4) => bool');
+  Expect.equals(
+      closureC_011_1_class_5(C_011_1_class_5()).runtimeType.toString(),
+      '(C_011_1_class_5) => bool');
+
   Set<String> uniques = {};
 
   // f_*1*_*;
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_100_0.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_100_0.dart
index 6d2c07f..bbf23b8 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_100_0.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/lib_100_0.dart
@@ -3,13 +3,225 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import "package:expect/expect.dart";
 
 import 'libImport.dart';
 
 @pragma('dart2js:noInline')
+typeTest(dynamic t) {
+  if (t is T_100_0) {
+    return true;
+  }
+  if (t is T_110_0) {
+    return true;
+  }
+  if (t is T_101_1) {
+    return true;
+  }
+  if (t is T_111_1) {
+    return true;
+  }
+  if (t is T_110_0_type__1) {
+    return true;
+  }
+  if (t is T_110_0_type__2) {
+    return true;
+  }
+  if (t is T_110_0_type__3) {
+    return true;
+  }
+  if (t is T_110_0_type__4) {
+    return true;
+  }
+  if (t is T_110_0_type__5) {
+    return true;
+  }
+  if (t is T_110_0_type__6) {
+    return true;
+  }
+  if (t is T_110_0_type__7) {
+    return true;
+  }
+  if (t is T_101_1_type__1) {
+    return true;
+  }
+  if (t is T_101_1_type__2) {
+    return true;
+  }
+  if (t is T_101_1_type__3) {
+    return true;
+  }
+  if (t is T_101_1_type__4) {
+    return true;
+  }
+  if (t is T_101_1_type__5) {
+    return true;
+  }
+  if (t is T_101_1_type__6) {
+    return true;
+  }
+  if (t is T_111_1_type__1) {
+    return true;
+  }
+  if (t is T_111_1_type__2) {
+    return true;
+  }
+  if (t is T_111_1_type__3) {
+    return true;
+  }
+  if (t is T_111_1_type__4) {
+    return true;
+  }
+  if (t is T_111_1_type__5) {
+    return true;
+  }
+  if (t is T_111_1_type__6) {
+    return true;
+  }
+  if (t is T_111_1_type__7) {
+    return true;
+  }
+  if (t is T_111_1_type__8) {
+    return true;
+  }
+  if (t is T_111_1_type__9) {
+    return true;
+  }
+  return false;
+}
+
+@pragma('dart2js:noInline')
 g_100_0() {
+  // C_1**_*;
+  Expect.isFalse(typeTest(C_100_0()));
+  Expect.isFalse(typeTest(C_110_0()));
+  Expect.isFalse(typeTest(C_101_1()));
+  Expect.isFalse(typeTest(C_111_1()));
+  Expect.isFalse(typeTest(C_110_0_class_1()));
+  Expect.isFalse(typeTest(C_110_0_class_2()));
+  Expect.isFalse(typeTest(C_110_0_class_3()));
+  Expect.isFalse(typeTest(C_110_0_class_4()));
+  Expect.isFalse(typeTest(C_110_0_class_5()));
+  Expect.isFalse(typeTest(C_110_0_class_6()));
+  Expect.isFalse(typeTest(C_110_0_class_7()));
+  Expect.isFalse(typeTest(C_101_1_class_1()));
+  Expect.isFalse(typeTest(C_101_1_class_2()));
+  Expect.isFalse(typeTest(C_101_1_class_3()));
+  Expect.isFalse(typeTest(C_101_1_class_4()));
+  Expect.isFalse(typeTest(C_101_1_class_5()));
+  Expect.isFalse(typeTest(C_101_1_class_6()));
+  Expect.isFalse(typeTest(C_111_1_class_1()));
+  Expect.isFalse(typeTest(C_111_1_class_2()));
+  Expect.isFalse(typeTest(C_111_1_class_3()));
+  Expect.isFalse(typeTest(C_111_1_class_4()));
+  Expect.isFalse(typeTest(C_111_1_class_5()));
+  Expect.isFalse(typeTest(C_111_1_class_6()));
+  Expect.isFalse(typeTest(C_111_1_class_7()));
+  Expect.isFalse(typeTest(C_111_1_class_8()));
+  Expect.isFalse(typeTest(C_111_1_class_9()));
+
+  Expect.isTrue(closureC_100_0(C_100_0())(C_100_0()));
+  Expect.isTrue(closureC_110_0(C_110_0())(C_110_0()));
+  Expect.isTrue(closureC_101_1(C_101_1())(C_101_1()));
+  Expect.isTrue(closureC_111_1(C_111_1())(C_111_1()));
+  Expect.isTrue(closureC_110_0_class_1(C_110_0_class_1())(C_110_0_class_1()));
+  Expect.isTrue(closureC_110_0_class_2(C_110_0_class_2())(C_110_0_class_2()));
+  Expect.isTrue(closureC_110_0_class_3(C_110_0_class_3())(C_110_0_class_3()));
+  Expect.isTrue(closureC_110_0_class_4(C_110_0_class_4())(C_110_0_class_4()));
+  Expect.isTrue(closureC_110_0_class_5(C_110_0_class_5())(C_110_0_class_5()));
+  Expect.isTrue(closureC_110_0_class_6(C_110_0_class_6())(C_110_0_class_6()));
+  Expect.isTrue(closureC_110_0_class_7(C_110_0_class_7())(C_110_0_class_7()));
+  Expect.isTrue(closureC_101_1_class_1(C_101_1_class_1())(C_101_1_class_1()));
+  Expect.isTrue(closureC_101_1_class_2(C_101_1_class_2())(C_101_1_class_2()));
+  Expect.isTrue(closureC_101_1_class_3(C_101_1_class_3())(C_101_1_class_3()));
+  Expect.isTrue(closureC_101_1_class_4(C_101_1_class_4())(C_101_1_class_4()));
+  Expect.isTrue(closureC_101_1_class_5(C_101_1_class_5())(C_101_1_class_5()));
+  Expect.isTrue(closureC_101_1_class_6(C_101_1_class_6())(C_101_1_class_6()));
+  Expect.isTrue(closureC_111_1_class_1(C_111_1_class_1())(C_111_1_class_1()));
+  Expect.isTrue(closureC_111_1_class_2(C_111_1_class_2())(C_111_1_class_2()));
+  Expect.isTrue(closureC_111_1_class_3(C_111_1_class_3())(C_111_1_class_3()));
+  Expect.isTrue(closureC_111_1_class_4(C_111_1_class_4())(C_111_1_class_4()));
+  Expect.isTrue(closureC_111_1_class_5(C_111_1_class_5())(C_111_1_class_5()));
+  Expect.isTrue(closureC_111_1_class_6(C_111_1_class_6())(C_111_1_class_6()));
+  Expect.isTrue(closureC_111_1_class_7(C_111_1_class_7())(C_111_1_class_7()));
+  Expect.isTrue(closureC_111_1_class_8(C_111_1_class_8())(C_111_1_class_8()));
+  Expect.isTrue(closureC_111_1_class_9(C_111_1_class_9())(C_111_1_class_9()));
+
+  Expect.equals(
+      closureC_100_0(C_100_0()).runtimeType.toString(), '(C_100_0) => bool');
+  Expect.equals(
+      closureC_110_0(C_110_0()).runtimeType.toString(), '(C_110_0) => bool');
+  Expect.equals(
+      closureC_101_1(C_101_1()).runtimeType.toString(), '(C_101_1) => bool');
+  Expect.equals(
+      closureC_111_1(C_111_1()).runtimeType.toString(), '(C_111_1) => bool');
+  Expect.equals(
+      closureC_110_0_class_1(C_110_0_class_1()).runtimeType.toString(),
+      '(C_110_0_class_1) => bool');
+  Expect.equals(
+      closureC_110_0_class_2(C_110_0_class_2()).runtimeType.toString(),
+      '(C_110_0_class_2) => bool');
+  Expect.equals(
+      closureC_110_0_class_3(C_110_0_class_3()).runtimeType.toString(),
+      '(C_110_0_class_3) => bool');
+  Expect.equals(
+      closureC_110_0_class_4(C_110_0_class_4()).runtimeType.toString(),
+      '(C_110_0_class_4) => bool');
+  Expect.equals(
+      closureC_110_0_class_5(C_110_0_class_5()).runtimeType.toString(),
+      '(C_110_0_class_5) => bool');
+  Expect.equals(
+      closureC_110_0_class_6(C_110_0_class_6()).runtimeType.toString(),
+      '(C_110_0_class_6) => bool');
+  Expect.equals(
+      closureC_110_0_class_7(C_110_0_class_7()).runtimeType.toString(),
+      '(C_110_0_class_7) => bool');
+  Expect.equals(
+      closureC_101_1_class_1(C_101_1_class_1()).runtimeType.toString(),
+      '(C_101_1_class_1) => bool');
+  Expect.equals(
+      closureC_101_1_class_2(C_101_1_class_2()).runtimeType.toString(),
+      '(C_101_1_class_2) => bool');
+  Expect.equals(
+      closureC_101_1_class_3(C_101_1_class_3()).runtimeType.toString(),
+      '(C_101_1_class_3) => bool');
+  Expect.equals(
+      closureC_101_1_class_4(C_101_1_class_4()).runtimeType.toString(),
+      '(C_101_1_class_4) => bool');
+  Expect.equals(
+      closureC_101_1_class_5(C_101_1_class_5()).runtimeType.toString(),
+      '(C_101_1_class_5) => bool');
+  Expect.equals(
+      closureC_101_1_class_6(C_101_1_class_6()).runtimeType.toString(),
+      '(C_101_1_class_6) => bool');
+  Expect.equals(
+      closureC_111_1_class_1(C_111_1_class_1()).runtimeType.toString(),
+      '(C_111_1_class_1) => bool');
+  Expect.equals(
+      closureC_111_1_class_2(C_111_1_class_2()).runtimeType.toString(),
+      '(C_111_1_class_2) => bool');
+  Expect.equals(
+      closureC_111_1_class_3(C_111_1_class_3()).runtimeType.toString(),
+      '(C_111_1_class_3) => bool');
+  Expect.equals(
+      closureC_111_1_class_4(C_111_1_class_4()).runtimeType.toString(),
+      '(C_111_1_class_4) => bool');
+  Expect.equals(
+      closureC_111_1_class_5(C_111_1_class_5()).runtimeType.toString(),
+      '(C_111_1_class_5) => bool');
+  Expect.equals(
+      closureC_111_1_class_6(C_111_1_class_6()).runtimeType.toString(),
+      '(C_111_1_class_6) => bool');
+  Expect.equals(
+      closureC_111_1_class_7(C_111_1_class_7()).runtimeType.toString(),
+      '(C_111_1_class_7) => bool');
+  Expect.equals(
+      closureC_111_1_class_8(C_111_1_class_8()).runtimeType.toString(),
+      '(C_111_1_class_8) => bool');
+  Expect.equals(
+      closureC_111_1_class_9(C_111_1_class_9()).runtimeType.toString(),
+      '(C_111_1_class_9) => bool');
+
   Set<String> uniques = {};
 
   // f_1**_*;
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/main.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/main.dart
index fb21cef..5f1c08c 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/main.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/less_simple/main.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import 'lib1.dart';
 import 'lib2.dart';
 import 'lib3.dart';
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib1.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib1.dart
index c664b0c..d91a48b 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib1.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib1.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import 'lib_100.dart' deferred as b1;
 
 entryLib1() async {
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib2.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib2.dart
index 6741292..7960202 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib2.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib2.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import 'lib_010.dart' deferred as b2;
 
 entryLib2() async {
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib3.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib3.dart
index 2133ef7..e62cd54 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib3.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib3.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import 'lib_001.dart' deferred as b3;
 
 entryLib3() async {
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/libImport.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/libImport.dart
index 8d1058b..27f453d 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/libImport.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/libImport.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import "package:expect/expect.dart";
 
 void v(Set<String> u, String name, int bit) {
@@ -11,6 +10,254 @@
   Expect.equals(name[bit], '1');
 }
 
+class C_100 {
+  const C_100();
+}
+
+class M_100 {}
+
+class T_100 {}
+
+const C_100 iC_100 = const C_100();
+closureC_100(foo) => (C_100 unused) => iC_100.toString() == foo.toString();
+
+class C_101 {
+  const C_101();
+}
+
+class M_101 {}
+
+class T_101 {}
+
+const C_101 iC_101 = const C_101();
+closureC_101(foo) => (C_101 unused) => iC_101.toString() == foo.toString();
+
+class C_111 {
+  const C_111();
+}
+
+class M_111 {}
+
+class T_111 {}
+
+const C_111 iC_111 = const C_111();
+closureC_111(foo) => (C_111 unused) => iC_111.toString() == foo.toString();
+
+class C_010 {
+  const C_010();
+}
+
+class M_010 {}
+
+class T_010 {}
+
+const C_010 iC_010 = const C_010();
+closureC_010(foo) => (C_010 unused) => iC_010.toString() == foo.toString();
+
+class C_011 {
+  const C_011();
+}
+
+class M_011 {}
+
+class T_011 {}
+
+const C_011 iC_011 = const C_011();
+closureC_011(foo) => (C_011 unused) => iC_011.toString() == foo.toString();
+
+class C_001 {
+  const C_001();
+}
+
+class M_001 {}
+
+class T_001 {}
+
+const C_001 iC_001 = const C_001();
+closureC_001(foo) => (C_001 unused) => iC_001.toString() == foo.toString();
+
+class C_101_class_1 extends C_100
+    with M_100, M_101, M_111, M_001
+    implements C_101, C_111, C_001 {
+  const C_101_class_1();
+}
+
+const C_101_class_1 iC_101_class_1 = const C_101_class_1();
+closureC_101_class_1(foo) =>
+    (C_101_class_1 unused) => iC_101_class_1.toString() == foo.toString();
+
+class T_101_type__1 extends T_100
+    with M_100, M_101, M_111, M_001
+    implements T_101, T_111, T_001 {}
+
+class C_101_class_2 extends C_101
+    with M_100, M_101, M_111, M_001
+    implements C_100, C_111, C_001 {
+  const C_101_class_2();
+}
+
+const C_101_class_2 iC_101_class_2 = const C_101_class_2();
+closureC_101_class_2(foo) =>
+    (C_101_class_2 unused) => iC_101_class_2.toString() == foo.toString();
+
+class T_101_type__2 extends T_101
+    with M_100, M_101, M_111, M_001
+    implements T_100, T_111, T_001 {}
+
+class C_101_class_3 extends C_111
+    with M_100, M_101, M_111, M_001
+    implements C_100, C_101, C_001 {
+  const C_101_class_3();
+}
+
+const C_101_class_3 iC_101_class_3 = const C_101_class_3();
+closureC_101_class_3(foo) =>
+    (C_101_class_3 unused) => iC_101_class_3.toString() == foo.toString();
+
+class T_101_type__3 extends T_111
+    with M_100, M_101, M_111, M_001
+    implements T_100, T_101, T_001 {}
+
+class C_101_class_4 extends C_001
+    with M_100, M_101, M_111, M_001
+    implements C_100, C_101, C_111 {
+  const C_101_class_4();
+}
+
+const C_101_class_4 iC_101_class_4 = const C_101_class_4();
+closureC_101_class_4(foo) =>
+    (C_101_class_4 unused) => iC_101_class_4.toString() == foo.toString();
+
+class T_101_type__4 extends T_001
+    with M_100, M_101, M_111, M_001
+    implements T_100, T_101, T_111 {}
+
+class C_111_class_1 extends C_100
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements C_101, C_111, C_010, C_011, C_001 {
+  const C_111_class_1();
+}
+
+const C_111_class_1 iC_111_class_1 = const C_111_class_1();
+closureC_111_class_1(foo) =>
+    (C_111_class_1 unused) => iC_111_class_1.toString() == foo.toString();
+
+class T_111_type__1 extends T_100
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements T_101, T_111, T_010, T_011, T_001 {}
+
+class C_111_class_2 extends C_101
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements C_100, C_111, C_010, C_011, C_001 {
+  const C_111_class_2();
+}
+
+const C_111_class_2 iC_111_class_2 = const C_111_class_2();
+closureC_111_class_2(foo) =>
+    (C_111_class_2 unused) => iC_111_class_2.toString() == foo.toString();
+
+class T_111_type__2 extends T_101
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements T_100, T_111, T_010, T_011, T_001 {}
+
+class C_111_class_3 extends C_111
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements C_100, C_101, C_010, C_011, C_001 {
+  const C_111_class_3();
+}
+
+const C_111_class_3 iC_111_class_3 = const C_111_class_3();
+closureC_111_class_3(foo) =>
+    (C_111_class_3 unused) => iC_111_class_3.toString() == foo.toString();
+
+class T_111_type__3 extends T_111
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements T_100, T_101, T_010, T_011, T_001 {}
+
+class C_111_class_4 extends C_010
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements C_100, C_101, C_111, C_011, C_001 {
+  const C_111_class_4();
+}
+
+const C_111_class_4 iC_111_class_4 = const C_111_class_4();
+closureC_111_class_4(foo) =>
+    (C_111_class_4 unused) => iC_111_class_4.toString() == foo.toString();
+
+class T_111_type__4 extends T_010
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements T_100, T_101, T_111, T_011, T_001 {}
+
+class C_111_class_5 extends C_011
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements C_100, C_101, C_111, C_010, C_001 {
+  const C_111_class_5();
+}
+
+const C_111_class_5 iC_111_class_5 = const C_111_class_5();
+closureC_111_class_5(foo) =>
+    (C_111_class_5 unused) => iC_111_class_5.toString() == foo.toString();
+
+class T_111_type__5 extends T_011
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements T_100, T_101, T_111, T_010, T_001 {}
+
+class C_111_class_6 extends C_001
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements C_100, C_101, C_111, C_010, C_011 {
+  const C_111_class_6();
+}
+
+const C_111_class_6 iC_111_class_6 = const C_111_class_6();
+closureC_111_class_6(foo) =>
+    (C_111_class_6 unused) => iC_111_class_6.toString() == foo.toString();
+
+class T_111_type__6 extends T_001
+    with M_100, M_101, M_111, M_010, M_011, M_001
+    implements T_100, T_101, T_111, T_010, T_011 {}
+
+class C_011_class_1 extends C_010
+    with M_010, M_011, M_001
+    implements C_011, C_001 {
+  const C_011_class_1();
+}
+
+const C_011_class_1 iC_011_class_1 = const C_011_class_1();
+closureC_011_class_1(foo) =>
+    (C_011_class_1 unused) => iC_011_class_1.toString() == foo.toString();
+
+class T_011_type__1 extends T_010
+    with M_010, M_011, M_001
+    implements T_011, T_001 {}
+
+class C_011_class_2 extends C_011
+    with M_010, M_011, M_001
+    implements C_010, C_001 {
+  const C_011_class_2();
+}
+
+const C_011_class_2 iC_011_class_2 = const C_011_class_2();
+closureC_011_class_2(foo) =>
+    (C_011_class_2 unused) => iC_011_class_2.toString() == foo.toString();
+
+class T_011_type__2 extends T_011
+    with M_010, M_011, M_001
+    implements T_010, T_001 {}
+
+class C_011_class_3 extends C_001
+    with M_010, M_011, M_001
+    implements C_010, C_011 {
+  const C_011_class_3();
+}
+
+const C_011_class_3 iC_011_class_3 = const C_011_class_3();
+closureC_011_class_3(foo) =>
+    (C_011_class_3 unused) => iC_011_class_3.toString() == foo.toString();
+
+class T_011_type__3 extends T_001
+    with M_010, M_011, M_001
+    implements T_010, T_011 {}
+
 @pragma('dart2js:noInline')
 f_100(Set<String> u, int b) => v(u, '100', b);
 @pragma('dart2js:noInline')
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_001.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_001.dart
index 16c561a..c8be5f5 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_001.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_001.dart
@@ -3,13 +3,119 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import "package:expect/expect.dart";
 
 import 'libImport.dart';
 
 @pragma('dart2js:noInline')
+typeTest(dynamic t) {
+  if (t is T_001) {
+    return true;
+  }
+  if (t is T_101_type__1) {
+    return true;
+  }
+  if (t is T_101_type__2) {
+    return true;
+  }
+  if (t is T_101_type__3) {
+    return true;
+  }
+  if (t is T_101_type__4) {
+    return true;
+  }
+  if (t is T_111_type__1) {
+    return true;
+  }
+  if (t is T_111_type__2) {
+    return true;
+  }
+  if (t is T_111_type__3) {
+    return true;
+  }
+  if (t is T_111_type__4) {
+    return true;
+  }
+  if (t is T_111_type__5) {
+    return true;
+  }
+  if (t is T_111_type__6) {
+    return true;
+  }
+  if (t is T_011_type__1) {
+    return true;
+  }
+  if (t is T_011_type__2) {
+    return true;
+  }
+  if (t is T_011_type__3) {
+    return true;
+  }
+  return false;
+}
+
+@pragma('dart2js:noInline')
 g_001() {
+  // C_**1;
+  Expect.isFalse(typeTest(C_001()));
+  Expect.isFalse(typeTest(C_101_class_1()));
+  Expect.isFalse(typeTest(C_101_class_2()));
+  Expect.isFalse(typeTest(C_101_class_3()));
+  Expect.isFalse(typeTest(C_101_class_4()));
+  Expect.isFalse(typeTest(C_111_class_1()));
+  Expect.isFalse(typeTest(C_111_class_2()));
+  Expect.isFalse(typeTest(C_111_class_3()));
+  Expect.isFalse(typeTest(C_111_class_4()));
+  Expect.isFalse(typeTest(C_111_class_5()));
+  Expect.isFalse(typeTest(C_111_class_6()));
+  Expect.isFalse(typeTest(C_011_class_1()));
+  Expect.isFalse(typeTest(C_011_class_2()));
+  Expect.isFalse(typeTest(C_011_class_3()));
+
+  Expect.isTrue(closureC_001(C_001())(C_001()));
+  Expect.isTrue(closureC_101_class_1(C_101_class_1())(C_101_class_1()));
+  Expect.isTrue(closureC_101_class_2(C_101_class_2())(C_101_class_2()));
+  Expect.isTrue(closureC_101_class_3(C_101_class_3())(C_101_class_3()));
+  Expect.isTrue(closureC_101_class_4(C_101_class_4())(C_101_class_4()));
+  Expect.isTrue(closureC_111_class_1(C_111_class_1())(C_111_class_1()));
+  Expect.isTrue(closureC_111_class_2(C_111_class_2())(C_111_class_2()));
+  Expect.isTrue(closureC_111_class_3(C_111_class_3())(C_111_class_3()));
+  Expect.isTrue(closureC_111_class_4(C_111_class_4())(C_111_class_4()));
+  Expect.isTrue(closureC_111_class_5(C_111_class_5())(C_111_class_5()));
+  Expect.isTrue(closureC_111_class_6(C_111_class_6())(C_111_class_6()));
+  Expect.isTrue(closureC_011_class_1(C_011_class_1())(C_011_class_1()));
+  Expect.isTrue(closureC_011_class_2(C_011_class_2())(C_011_class_2()));
+  Expect.isTrue(closureC_011_class_3(C_011_class_3())(C_011_class_3()));
+
+  Expect.equals(
+      closureC_001(C_001()).runtimeType.toString(), '(C_001) => bool');
+  Expect.equals(closureC_101_class_1(C_101_class_1()).runtimeType.toString(),
+      '(C_101_class_1) => bool');
+  Expect.equals(closureC_101_class_2(C_101_class_2()).runtimeType.toString(),
+      '(C_101_class_2) => bool');
+  Expect.equals(closureC_101_class_3(C_101_class_3()).runtimeType.toString(),
+      '(C_101_class_3) => bool');
+  Expect.equals(closureC_101_class_4(C_101_class_4()).runtimeType.toString(),
+      '(C_101_class_4) => bool');
+  Expect.equals(closureC_111_class_1(C_111_class_1()).runtimeType.toString(),
+      '(C_111_class_1) => bool');
+  Expect.equals(closureC_111_class_2(C_111_class_2()).runtimeType.toString(),
+      '(C_111_class_2) => bool');
+  Expect.equals(closureC_111_class_3(C_111_class_3()).runtimeType.toString(),
+      '(C_111_class_3) => bool');
+  Expect.equals(closureC_111_class_4(C_111_class_4()).runtimeType.toString(),
+      '(C_111_class_4) => bool');
+  Expect.equals(closureC_111_class_5(C_111_class_5()).runtimeType.toString(),
+      '(C_111_class_5) => bool');
+  Expect.equals(closureC_111_class_6(C_111_class_6()).runtimeType.toString(),
+      '(C_111_class_6) => bool');
+  Expect.equals(closureC_011_class_1(C_011_class_1()).runtimeType.toString(),
+      '(C_011_class_1) => bool');
+  Expect.equals(closureC_011_class_2(C_011_class_2()).runtimeType.toString(),
+      '(C_011_class_2) => bool');
+  Expect.equals(closureC_011_class_3(C_011_class_3()).runtimeType.toString(),
+      '(C_011_class_3) => bool');
+
   Set<String> uniques = {};
 
   // f_**1;
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_010.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_010.dart
index 3ac623a..6827fe3 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_010.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_010.dart
@@ -3,13 +3,98 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import "package:expect/expect.dart";
 
 import 'libImport.dart';
 
 @pragma('dart2js:noInline')
+typeTest(dynamic t) {
+  if (t is T_010) {
+    return true;
+  }
+  if (t is T_011) {
+    return true;
+  }
+  if (t is T_111_type__1) {
+    return true;
+  }
+  if (t is T_111_type__2) {
+    return true;
+  }
+  if (t is T_111_type__3) {
+    return true;
+  }
+  if (t is T_111_type__4) {
+    return true;
+  }
+  if (t is T_111_type__5) {
+    return true;
+  }
+  if (t is T_111_type__6) {
+    return true;
+  }
+  if (t is T_011_type__1) {
+    return true;
+  }
+  if (t is T_011_type__2) {
+    return true;
+  }
+  if (t is T_011_type__3) {
+    return true;
+  }
+  return false;
+}
+
+@pragma('dart2js:noInline')
 g_010() {
+  // C_*1*;
+  Expect.isFalse(typeTest(C_010()));
+  Expect.isFalse(typeTest(C_011()));
+  Expect.isFalse(typeTest(C_111_class_1()));
+  Expect.isFalse(typeTest(C_111_class_2()));
+  Expect.isFalse(typeTest(C_111_class_3()));
+  Expect.isFalse(typeTest(C_111_class_4()));
+  Expect.isFalse(typeTest(C_111_class_5()));
+  Expect.isFalse(typeTest(C_111_class_6()));
+  Expect.isFalse(typeTest(C_011_class_1()));
+  Expect.isFalse(typeTest(C_011_class_2()));
+  Expect.isFalse(typeTest(C_011_class_3()));
+
+  Expect.isTrue(closureC_010(C_010())(C_010()));
+  Expect.isTrue(closureC_011(C_011())(C_011()));
+  Expect.isTrue(closureC_111_class_1(C_111_class_1())(C_111_class_1()));
+  Expect.isTrue(closureC_111_class_2(C_111_class_2())(C_111_class_2()));
+  Expect.isTrue(closureC_111_class_3(C_111_class_3())(C_111_class_3()));
+  Expect.isTrue(closureC_111_class_4(C_111_class_4())(C_111_class_4()));
+  Expect.isTrue(closureC_111_class_5(C_111_class_5())(C_111_class_5()));
+  Expect.isTrue(closureC_111_class_6(C_111_class_6())(C_111_class_6()));
+  Expect.isTrue(closureC_011_class_1(C_011_class_1())(C_011_class_1()));
+  Expect.isTrue(closureC_011_class_2(C_011_class_2())(C_011_class_2()));
+  Expect.isTrue(closureC_011_class_3(C_011_class_3())(C_011_class_3()));
+
+  Expect.equals(
+      closureC_010(C_010()).runtimeType.toString(), '(C_010) => bool');
+  Expect.equals(
+      closureC_011(C_011()).runtimeType.toString(), '(C_011) => bool');
+  Expect.equals(closureC_111_class_1(C_111_class_1()).runtimeType.toString(),
+      '(C_111_class_1) => bool');
+  Expect.equals(closureC_111_class_2(C_111_class_2()).runtimeType.toString(),
+      '(C_111_class_2) => bool');
+  Expect.equals(closureC_111_class_3(C_111_class_3()).runtimeType.toString(),
+      '(C_111_class_3) => bool');
+  Expect.equals(closureC_111_class_4(C_111_class_4()).runtimeType.toString(),
+      '(C_111_class_4) => bool');
+  Expect.equals(closureC_111_class_5(C_111_class_5()).runtimeType.toString(),
+      '(C_111_class_5) => bool');
+  Expect.equals(closureC_111_class_6(C_111_class_6()).runtimeType.toString(),
+      '(C_111_class_6) => bool');
+  Expect.equals(closureC_011_class_1(C_011_class_1()).runtimeType.toString(),
+      '(C_011_class_1) => bool');
+  Expect.equals(closureC_011_class_2(C_011_class_2()).runtimeType.toString(),
+      '(C_011_class_2) => bool');
+  Expect.equals(closureC_011_class_3(C_011_class_3()).runtimeType.toString(),
+      '(C_011_class_3) => bool');
+
   Set<String> uniques = {};
 
   // f_*1*;
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_100.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_100.dart
index 631b02b..5f96ca1 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_100.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/lib_100.dart
@@ -3,13 +3,112 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import "package:expect/expect.dart";
 
 import 'libImport.dart';
 
 @pragma('dart2js:noInline')
+typeTest(dynamic t) {
+  if (t is T_100) {
+    return true;
+  }
+  if (t is T_101) {
+    return true;
+  }
+  if (t is T_111) {
+    return true;
+  }
+  if (t is T_101_type__1) {
+    return true;
+  }
+  if (t is T_101_type__2) {
+    return true;
+  }
+  if (t is T_101_type__3) {
+    return true;
+  }
+  if (t is T_101_type__4) {
+    return true;
+  }
+  if (t is T_111_type__1) {
+    return true;
+  }
+  if (t is T_111_type__2) {
+    return true;
+  }
+  if (t is T_111_type__3) {
+    return true;
+  }
+  if (t is T_111_type__4) {
+    return true;
+  }
+  if (t is T_111_type__5) {
+    return true;
+  }
+  if (t is T_111_type__6) {
+    return true;
+  }
+  return false;
+}
+
+@pragma('dart2js:noInline')
 g_100() {
+  // C_1**;
+  Expect.isFalse(typeTest(C_100()));
+  Expect.isFalse(typeTest(C_101()));
+  Expect.isFalse(typeTest(C_111()));
+  Expect.isFalse(typeTest(C_101_class_1()));
+  Expect.isFalse(typeTest(C_101_class_2()));
+  Expect.isFalse(typeTest(C_101_class_3()));
+  Expect.isFalse(typeTest(C_101_class_4()));
+  Expect.isFalse(typeTest(C_111_class_1()));
+  Expect.isFalse(typeTest(C_111_class_2()));
+  Expect.isFalse(typeTest(C_111_class_3()));
+  Expect.isFalse(typeTest(C_111_class_4()));
+  Expect.isFalse(typeTest(C_111_class_5()));
+  Expect.isFalse(typeTest(C_111_class_6()));
+
+  Expect.isTrue(closureC_100(C_100())(C_100()));
+  Expect.isTrue(closureC_101(C_101())(C_101()));
+  Expect.isTrue(closureC_111(C_111())(C_111()));
+  Expect.isTrue(closureC_101_class_1(C_101_class_1())(C_101_class_1()));
+  Expect.isTrue(closureC_101_class_2(C_101_class_2())(C_101_class_2()));
+  Expect.isTrue(closureC_101_class_3(C_101_class_3())(C_101_class_3()));
+  Expect.isTrue(closureC_101_class_4(C_101_class_4())(C_101_class_4()));
+  Expect.isTrue(closureC_111_class_1(C_111_class_1())(C_111_class_1()));
+  Expect.isTrue(closureC_111_class_2(C_111_class_2())(C_111_class_2()));
+  Expect.isTrue(closureC_111_class_3(C_111_class_3())(C_111_class_3()));
+  Expect.isTrue(closureC_111_class_4(C_111_class_4())(C_111_class_4()));
+  Expect.isTrue(closureC_111_class_5(C_111_class_5())(C_111_class_5()));
+  Expect.isTrue(closureC_111_class_6(C_111_class_6())(C_111_class_6()));
+
+  Expect.equals(
+      closureC_100(C_100()).runtimeType.toString(), '(C_100) => bool');
+  Expect.equals(
+      closureC_101(C_101()).runtimeType.toString(), '(C_101) => bool');
+  Expect.equals(
+      closureC_111(C_111()).runtimeType.toString(), '(C_111) => bool');
+  Expect.equals(closureC_101_class_1(C_101_class_1()).runtimeType.toString(),
+      '(C_101_class_1) => bool');
+  Expect.equals(closureC_101_class_2(C_101_class_2()).runtimeType.toString(),
+      '(C_101_class_2) => bool');
+  Expect.equals(closureC_101_class_3(C_101_class_3()).runtimeType.toString(),
+      '(C_101_class_3) => bool');
+  Expect.equals(closureC_101_class_4(C_101_class_4()).runtimeType.toString(),
+      '(C_101_class_4) => bool');
+  Expect.equals(closureC_111_class_1(C_111_class_1()).runtimeType.toString(),
+      '(C_111_class_1) => bool');
+  Expect.equals(closureC_111_class_2(C_111_class_2()).runtimeType.toString(),
+      '(C_111_class_2) => bool');
+  Expect.equals(closureC_111_class_3(C_111_class_3()).runtimeType.toString(),
+      '(C_111_class_3) => bool');
+  Expect.equals(closureC_111_class_4(C_111_class_4()).runtimeType.toString(),
+      '(C_111_class_4) => bool');
+  Expect.equals(closureC_111_class_5(C_111_class_5()).runtimeType.toString(),
+      '(C_111_class_5) => bool');
+  Expect.equals(closureC_111_class_6(C_111_class_6()).runtimeType.toString(),
+      '(C_111_class_6) => bool');
+
   Set<String> uniques = {};
 
   // f_1**;
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/main.dart b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/main.dart
index ef1a426..afcad53 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/main.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/golden/simple/main.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 import 'lib1.dart';
 import 'lib2.dart';
 import 'lib3.dart';
diff --git a/pkg/compiler/test/tool/graph_isomorphizer/graph_isomorphizer_test.dart b/pkg/compiler/test/tool/graph_isomorphizer/graph_isomorphizer_test.dart
index eda8526..228adcd 100644
--- a/pkg/compiler/test/tool/graph_isomorphizer/graph_isomorphizer_test.dart
+++ b/pkg/compiler/test/tool/graph_isomorphizer/graph_isomorphizer_test.dart
@@ -8,6 +8,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:compiler/compiler_new.dart';
+import 'package:dart_style/dart_style.dart' show DartFormatter;
 import '../../helpers/memory_compiler.dart';
 import '../../../tool/graph_isomorphizer.dart';
 
@@ -42,7 +43,8 @@
 
 void verifyGeneratedFile(
     String filename, StringBuffer contents, Map<String, String> expectations) {
-  Expect.stringEquals(contents.toString(), expectations[filename]);
+  Expect.stringEquals(
+      DartFormatter().format(contents.toString()), expectations[filename]);
 }
 
 GraphIsomorphizer generateFiles(List<String> graphFileLines,
diff --git a/pkg/compiler/tool/graph_isomorphizer.dart b/pkg/compiler/tool/graph_isomorphizer.dart
index dca1cf1..49894bd 100644
--- a/pkg/compiler/tool/graph_isomorphizer.dart
+++ b/pkg/compiler/tool/graph_isomorphizer.dart
@@ -37,8 +37,14 @@
 /// with three bits, each of 100, 010, 001 and 111 must be present in the graph
 /// file, but 110, 101, and 011 are optional.
 
+// TODO(joshualitt): This is a good start for a fuzzer. There is still work to
+// do:
+// * Emit some classes as const and some not
+// * Randomize what we emit as we walk the graph so it is more sparse.
+
 import 'dart:io';
 import 'dart:math';
+import 'package:dart_style/dart_style.dart' show DartFormatter;
 
 typedef NameFunc = String Function(List<int>, int);
 
@@ -112,6 +118,18 @@
   /// A map of bit positions to lists of bit lists.
   final Map<int, List<List<int>>> names;
 
+  /// A map of bit positions to lists of class names.
+  final Map<int, List<String>> classNames = {};
+  final Map<int, List<String>> mixerClassNames = {};
+
+  /// A map of bit positions to lists of mixin names.
+  final Map<int, List<String>> mixinNames = {};
+
+  /// A map of bit positions to lists of class names used only as types.
+  final Map<int, List<String>> typeNames = {};
+  final Map<int, List<String>> mixerTypeNames = {};
+  final Map<int, List<String>> closureNames = {};
+
   /// We will permute bits up until the maximum bit.
   int maxBit = 0;
 
@@ -135,6 +153,10 @@
     out.write('import "package:expect/expect.dart";\n\n');
   }
 
+  void newline(StringBuffer out) {
+    out.write('\n');
+  }
+
   /// Generates the header for a file.
   void generateHeader(StringBuffer out) {
     if (!skipCopyright) {
@@ -144,11 +166,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
-
 """);
     }
   }
 
+  /// Generates the root import, where classes, types, mixins, and closures
+  /// live.
   void generateRootImport(StringBuffer out) {
     generateHeader(out);
     importExpect(out);
@@ -161,11 +184,102 @@
         "  Expect.equals(name[bit], '1');\n" +
         '}\n\n');
 
-    Set<String> uniques = {};
-
     // Sort the names to ensure they are in a canonical order.
     var nameKeys = names.keys.toList();
     nameKeys.sort();
+
+    // Generate the 'base' classes, mixins, and types which will be combined to
+    // generate hierarchies. Also generate a const instance per class and a closure
+    // to invoke.
+    Set<String> uniques = {};
+    for (var bitPosition in nameKeys) {
+      var bitsList = names[bitPosition];
+      for (var bits in bitsList) {
+        var name = generateBitString(bits);
+        if (!uniques.add(name)) continue;
+        String className = 'C$name';
+        String mixinName = 'M$name';
+        String typeName = 'T$name';
+        (classNames[bitPosition] ??= []).add(className);
+        (mixinNames[bitPosition] ??= []).add(mixinName);
+        (typeNames[bitPosition] ??= []).add(typeName);
+        (mixerClassNames[bitPosition] ??= []).add(className);
+        (mixerTypeNames[bitPosition] ??= []).add(typeName);
+        out.write('class $className { const $className(); }\n');
+        out.write('class $mixinName {}\n');
+        out.write('class $typeName {}\n');
+        out.write('const $className i$className = const $className();\n');
+        out.write('closure$className(foo) => ($className unused) ');
+        out.write('=> i$className.toString() == foo.toString();\n');
+      }
+    }
+
+    // Generate combined classes and types, as well as const instances and
+    // closures.
+    newline(out);
+    uniques = {};
+    for (var bitPosition in nameKeys) {
+      var bitsList = names[bitPosition];
+      for (var bits in bitsList) {
+        var name = generateBitString(bits);
+        var bitCount = bits.reduce((a, b) => a + b);
+        var baseName = 'C$name';
+        if (!uniques.add(baseName)) continue;
+        if (bitCount > 1) {
+          List<String> classes = [];
+          List<String> mixins = [];
+          List<String> types = [];
+          for (int i = 0; i < bits.length; i++) {
+            if (bits[i] == 1) {
+              classes.addAll(classNames[i]);
+              mixins.addAll(mixinNames[i]);
+              types.addAll(typeNames[i]);
+            }
+          }
+          String mixinString = mixins.join(', ');
+          int count = 1;
+          assert(classes.length == types.length);
+          for (int i = 0; i < classes.length; i++) {
+            var cls = classes[i];
+            var type = types[i];
+            List<String> classImpls = [];
+            List<String> typeImpls = [];
+            if (i > 0) {
+              classImpls.addAll(classes.sublist(0, i));
+              typeImpls.addAll(types.sublist(0, i));
+            }
+            if (i < classes.length - 1) {
+              classImpls.addAll(classes.sublist(i + 1));
+              typeImpls.addAll(types.sublist(i + 1));
+            }
+            var classImplementsString = classImpls.join(', ');
+            String className = '${baseName}_class_${count}';
+            out.write('class $className extends $cls with $mixinString ');
+            out.write(
+                'implements $classImplementsString { const $className(); }\n');
+            out.write('const $className i$className = const $className();\n');
+            out.write('closure$className(foo) => ($className unused) ');
+            out.write('=> i$className.toString() == foo.toString();\n');
+
+            var typeImplementsString = typeImpls.join(', ');
+            String typeName = 'T${name}_type__${count}';
+            out.write('class $typeName extends $type with $mixinString ');
+            out.write('implements $typeImplementsString {}\n');
+            for (int i = 0; i < bits.length; i++) {
+              if (bits[i] == 1) {
+                mixerClassNames[i].add(className);
+                mixerTypeNames[i].add(typeName);
+              }
+            }
+            count++;
+          }
+        }
+      }
+    }
+
+    // Generate functions.
+    newline(out);
+    uniques = {};
     for (var name in nameKeys) {
       var bitsList = names[name];
       for (var bits in bitsList) {
@@ -186,13 +300,41 @@
     generateHeader(out);
     importExpect(out);
     out.write("import '$import';\n\n");
+
+    // create type test.
     noInlineDecorator(out);
-    out.write('g$name() {\n'
-        '  Set<String> uniques = {};\n\n'
-        '  // f${generateCommentName(bits, bit)};\n');
-    int count = 0;
+    out.write('typeTest(dynamic t) {\n');
+    for (var type in mixerTypeNames[bit]) {
+      out.write('  if (t is $type) { return true; }\n');
+    }
+    out.write('  return false;\n');
+    out.write('}\n\n');
+
+    noInlineDecorator(out);
+    out.write('g$name() {\n');
+    out.write('  // C${generateCommentName(bits, bit)};\n');
+
+    // Construct new instances of each class and pass them to the typeTest
+    for (var cls in mixerClassNames[bit]) {
+      out.write('  Expect.isFalse(typeTest($cls()));\n');
+    }
+    newline(out);
+
+    // Invoke the test closure for each class.
+    for (var cls in mixerClassNames[bit]) {
+      out.write('  Expect.isTrue(closure$cls($cls())($cls()));\n');
+    }
+    newline(out);
+
+    // Verify the runtimeTypes of the closures haven't been mangled.
+    for (var cls in mixerClassNames[bit]) {
+      out.write('  Expect.equals(closure$cls($cls()).runtimeType.toString(), ');
+      out.write("'($cls) => bool');\n");
+    }
+    newline(out);
 
     // Collect the names so we can sort them and put them in a canonical order.
+    int count = 0;
     List<String> namesBits = [];
     names[bit].forEach((nameBits) {
       var nameString = generateBitString(nameBits);
@@ -200,6 +342,9 @@
       count++;
     });
 
+    out.write('  Set<String> uniques = {};\n\n'
+        '  // f${generateCommentName(bits, bit)};\n');
+
     namesBits.sort();
     for (var name in namesBits) {
       out.write('  f$name(uniques, $bit);\n');
@@ -300,7 +445,7 @@
     var file = File(this.outDirectory + '/' + filename);
     file.createSync(recursive: true);
     var sink = file.openWrite();
-    sink.write(contents);
+    sink.write(DartFormatter().format(contents.toString()));
     sink.close();
   }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 6cc44bc..ff29dc3 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -5151,7 +5151,7 @@
     }
     int offset = reason.writeExpression.fileOffset;
     return templateVariableCouldBeNullDueToWrite
-        .withArguments(reason.variable.name)
+        .withArguments(reason.variable.name, reason.documentationLink)
         .withLocation(inferrer.helper.uri, offset, noLength);
   }
 
@@ -5160,7 +5160,7 @@
       DemoteViaForEachVariableWrite<VariableDeclaration, Node> reason) {
     int offset = (reason.node as TreeNode).fileOffset;
     return templateVariableCouldBeNullDueToWrite
-        .withArguments(reason.variable.name)
+        .withArguments(reason.variable.name, reason.documentationLink)
         .withLocation(inferrer.helper.uri, offset, noLength);
   }
 
@@ -5183,7 +5183,7 @@
       propertyReference = member;
       propertyType = reason.staticType;
       return templateFieldNotPromoted
-          .withArguments(reason.propertyName)
+          .withArguments(reason.propertyName, reason.documentationLink)
           .withLocation(member.fileUri, member.fileOffset, noLength);
     } else {
       return null;
@@ -5192,6 +5192,8 @@
 
   @override
   LocatedMessage visitThisNotPromoted(ThisNotPromoted reason) {
-    return messageThisNotPromoted.withoutLocation();
+    return templateThisNotPromoted
+        .withArguments(reason.documentationLink)
+        .withoutLocation();
   }
 }
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 5599193..384cb20 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -4656,13 +4656,15 @@
 
 VariableCouldBeNullDueToWrite:
   template: "Variable '#name' could be null due to an intervening write."
-  tip: "Try null checking the variable after the write."
+  tip: "Try null checking the variable after the write.  See #string"
 
 FieldNotPromoted:
   template: "'#name' refers to a property so it couldn't be promoted."
+  tip: "See #string"
 
 ThisNotPromoted:
   template: "'this' can't be promoted."
+  tip: "See #string"
 
 NullablePropertyAccessError:
   template: "Property '#name' cannot be accessed on '#type' because it is potentially null."
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index dfcff07..cce4737 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -882,6 +882,7 @@
 preexisted
 preexisting
 preorder
+presented
 presubmit
 prev
 prime
@@ -892,6 +893,7 @@
 producers
 product
 progresses
+promo
 proof
 prop
 propose
diff --git a/tools/VERSION b/tools/VERSION
index 59b36cd..873a2c8 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 191
+PRERELEASE 192
 PRERELEASE_PATCH 0
\ No newline at end of file