| Index: pkg/compiler/lib/src/resolution/class_hierarchy.dart | 
| diff --git a/pkg/compiler/lib/src/resolution/class_hierarchy.dart b/pkg/compiler/lib/src/resolution/class_hierarchy.dart | 
| index f46b9fdc345e2f4bfdaa6eca017466a926b932bc..78e2341c0ef1a1dd09931b6158b89dbda6a19927 100644 | 
| --- a/pkg/compiler/lib/src/resolution/class_hierarchy.dart | 
| +++ b/pkg/compiler/lib/src/resolution/class_hierarchy.dart | 
| @@ -55,7 +55,10 @@ class TypeDefinitionVisitor extends MappingVisitor<DartType> { | 
| scope = Scope.buildEnclosingScope(element), | 
| super(compiler, registry); | 
|  | 
| -  DartType get objectType => compiler.coreTypes.objectType; | 
| +  CoreTypes get coreTypes => compiler.coreTypes; | 
| + | 
| +  DartType get objectType => coreTypes.objectType; | 
| + | 
|  | 
| void resolveTypeVariableBounds(NodeList node) { | 
| if (node == null) return; | 
| @@ -245,7 +248,7 @@ class ClassResolverVisitor extends TypeDefinitionVisitor { | 
| } | 
|  | 
| InterfaceType enumType = element.computeType(resolution); | 
| -    element.supertype = compiler.coreTypes.objectType; | 
| +    element.supertype = objectType; | 
| element.interfaces = const Link<DartType>(); | 
| calculateAllSupertypes(element); | 
|  | 
| @@ -579,24 +582,10 @@ class ClassResolverVisitor extends TypeDefinitionVisitor { | 
| if (cls.allSupertypesAndSelf != null) return; | 
| final DartType supertype = cls.supertype; | 
| if (supertype != null) { | 
| -      OrderedTypeSetBuilder allSupertypes = new OrderedTypeSetBuilder(cls); | 
| -      // TODO(15296): Collapse these iterations to one when the order is not | 
| -      // needed. | 
| -      allSupertypes.add(compiler, supertype); | 
| -      for (Link<DartType> interfaces = cls.interfaces; | 
| -           !interfaces.isEmpty; | 
| -           interfaces = interfaces.tail) { | 
| -        allSupertypes.add(compiler, interfaces.head); | 
| -      } | 
| - | 
| -      addAllSupertypes(allSupertypes, supertype); | 
| -      for (Link<DartType> interfaces = cls.interfaces; | 
| -           !interfaces.isEmpty; | 
| -           interfaces = interfaces.tail) { | 
| -        addAllSupertypes(allSupertypes, interfaces.head); | 
| -      } | 
| -      allSupertypes.add(compiler, cls.computeType(resolution)); | 
| -      cls.allSupertypesAndSelf = allSupertypes.toTypeSet(); | 
| +      cls.allSupertypesAndSelf = | 
| +          new OrderedTypeSetBuilder( | 
| +              cls, reporter: reporter, objectType: coreTypes.objectType) | 
| +              .createOrderedTypeSet(supertype, cls.interfaces); | 
| } else { | 
| assert(cls == compiler.coreClasses.objectClass); | 
| cls.allSupertypesAndSelf = | 
| @@ -604,27 +593,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor { | 
| } | 
| } | 
|  | 
| -  /** | 
| -   * Adds [type] and all supertypes of [type] to [allSupertypes] while | 
| -   * substituting type variables. | 
| -   */ | 
| -  void addAllSupertypes(OrderedTypeSetBuilder allSupertypes, | 
| -                        InterfaceType type) { | 
| -    ClassElement classElement = type.element; | 
| -    Link<DartType> supertypes = classElement.allSupertypes; | 
| -    assert(invariant(element, supertypes != null, | 
| -        message: "Supertypes not computed on $classElement " | 
| -                 "during resolution of $element")); | 
| -    while (!supertypes.isEmpty) { | 
| -      DartType supertype = supertypes.head; | 
| -      allSupertypes.add(compiler, supertype.substByContext(type)); | 
| -      supertypes = supertypes.tail; | 
| -    } | 
| -  } | 
| - | 
| isBlackListed(DartType type) { | 
| LibraryElement lib = element.library; | 
| -    CoreTypes coreTypes = compiler.coreTypes; | 
| return | 
| !identical(lib, compiler.coreLibrary) && | 
| !compiler.backend.isBackendLibrary(lib) && | 
|  |