| Index: pkg/compiler/lib/src/world.dart
 | 
| diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
 | 
| index 014b16e63ef01a9028f0c5e678f01ad2cbe088c8..dd786a425824575358f2f77a2d54908a567bcd94 100644
 | 
| --- a/pkg/compiler/lib/src/world.dart
 | 
| +++ b/pkg/compiler/lib/src/world.dart
 | 
| @@ -4,10 +4,10 @@
 | 
|  
 | 
|  library dart2js.world;
 | 
|  
 | 
| +import 'cache_strategy.dart';
 | 
|  import 'closure.dart' show SynthesizedCallMethodElementX;
 | 
|  import 'common/backend_api.dart' show BackendClasses;
 | 
|  import 'common.dart';
 | 
| -import 'compiler.dart' show Compiler;
 | 
|  import 'core_types.dart' show CoreClasses;
 | 
|  import 'dart_types.dart';
 | 
|  import 'elements/elements.dart'
 | 
| @@ -25,6 +25,7 @@ import 'universe/class_set.dart';
 | 
|  import 'universe/function_set.dart' show FunctionSet;
 | 
|  import 'universe/selector.dart' show Selector;
 | 
|  import 'universe/side_effects.dart' show SideEffects;
 | 
| +import 'universe/world_builder.dart' show ResolutionWorldBuilder;
 | 
|  import 'util/enumset.dart';
 | 
|  import 'util/util.dart' show Link;
 | 
|  
 | 
| @@ -46,6 +47,8 @@ abstract class ClosedWorld implements World {
 | 
|    /// Access to core classes used in the Dart language.
 | 
|    CoreClasses get coreClasses;
 | 
|  
 | 
| +  CommonMasks get commonMasks;
 | 
| +
 | 
|    /// Returns `true` if [cls] is either directly or indirectly instantiated.
 | 
|    bool isInstantiated(ClassElement cls);
 | 
|  
 | 
| @@ -334,7 +337,7 @@ abstract class OpenWorld implements World {
 | 
|    void registerUsedElement(Element element);
 | 
|    void registerTypedef(TypedefElement typedef);
 | 
|  
 | 
| -  ClosedWorld closeWorld();
 | 
| +  ClosedWorld closeWorld(DiagnosticReporter reporter);
 | 
|  
 | 
|    /// Returns an iterable over all mixin applications that mixin [cls].
 | 
|    Iterable<MixinApplicationElement> allMixinUsesOf(ClassElement cls);
 | 
| @@ -437,7 +440,7 @@ class WorldImpl implements ClosedWorld, ClosedWorldRefiner, OpenWorld {
 | 
|    /// Returns `true` if [cls] is implemented by an instantiated class.
 | 
|    bool isImplemented(ClassElement cls) {
 | 
|      assert(isClosed);
 | 
| -    return _compiler.resolverWorld.isImplemented(cls);
 | 
| +    return resolverWorld.isImplemented(cls);
 | 
|    }
 | 
|  
 | 
|    /// Returns an iterable over the directly instantiated classes that extend
 | 
| @@ -836,11 +839,9 @@ class WorldImpl implements ClosedWorld, ClosedWorldRefiner, OpenWorld {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  final Compiler _compiler;
 | 
| +  final JavaScriptBackend _backend;
 | 
|    BackendClasses get backendClasses => _backend.backendClasses;
 | 
| -  JavaScriptBackend get _backend => _compiler.backend;
 | 
| -  CommonMasks get commonMasks => _compiler.commonMasks;
 | 
| -  final FunctionSet allFunctions;
 | 
| +  FunctionSet _allFunctions;
 | 
|    final Set<Element> functionsCalledInLoop = new Set<Element>();
 | 
|    final Map<Element, SideEffects> sideEffects = new Map<Element, SideEffects>();
 | 
|  
 | 
| @@ -871,20 +872,33 @@ class WorldImpl implements ClosedWorld, ClosedWorldRefiner, OpenWorld {
 | 
|  
 | 
|    final Set<Element> alreadyPopulated;
 | 
|  
 | 
| +  CommonMasks _commonMasks;
 | 
| +
 | 
| +  final CoreClasses coreClasses;
 | 
| +
 | 
| +  final CacheStrategy cacheStrategy;
 | 
| +
 | 
| +  final ResolutionWorldBuilder resolverWorld;
 | 
| +
 | 
|    bool get isClosed => _closed;
 | 
|  
 | 
|    Set<ClassElement> typesImplementedBySubclassesOf(ClassElement cls) {
 | 
|      return _typesImplementedBySubclasses[cls.declaration];
 | 
|    }
 | 
|  
 | 
| -  WorldImpl(Compiler compiler)
 | 
| -      : allFunctions = new FunctionSet(compiler),
 | 
| -        this._compiler = compiler,
 | 
| -        alreadyPopulated = compiler.cacheStrategy.newSet();
 | 
| +  WorldImpl(this.resolverWorld, this._backend, this.coreClasses,
 | 
| +      CacheStrategy cacheStrategy)
 | 
| +      : this.cacheStrategy = cacheStrategy,
 | 
| +        alreadyPopulated = cacheStrategy.newSet() {
 | 
| +    _allFunctions = new FunctionSet(this);
 | 
| +  }
 | 
|  
 | 
| -  CoreClasses get coreClasses => _compiler.coreClasses;
 | 
| +  FunctionSet get allFunctions => _allFunctions;
 | 
|  
 | 
| -  DiagnosticReporter get reporter => _compiler.reporter;
 | 
| +  CommonMasks get commonMasks {
 | 
| +    assert(isClosed);
 | 
| +    return _commonMasks;
 | 
| +  }
 | 
|  
 | 
|    /// Called to add [cls] to the set of known classes.
 | 
|    ///
 | 
| @@ -979,7 +993,7 @@ class WorldImpl implements ClosedWorld, ClosedWorldRefiner, OpenWorld {
 | 
|  
 | 
|    void _updateClassHierarchyNodeForClass(ClassElement cls,
 | 
|        {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
 | 
| -    ClassHierarchyNode node = getClassHierarchyNode(cls);
 | 
| +    ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
 | 
|      _updateSuperClassHierarchyNodeForClass(node);
 | 
|      if (directlyInstantiated) {
 | 
|        node.isDirectlyInstantiated = true;
 | 
| @@ -989,13 +1003,12 @@ class WorldImpl implements ClosedWorld, ClosedWorldRefiner, OpenWorld {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  ClosedWorld closeWorld() {
 | 
| +  ClosedWorld closeWorld(DiagnosticReporter reporter) {
 | 
|      /// Updates the `isDirectlyInstantiated` and `isIndirectlyInstantiated`
 | 
|      /// properties of the [ClassHierarchyNode] for [cls].
 | 
|  
 | 
|      void addSubtypes(ClassElement cls, EnumSet<Instantiation> instantiations) {
 | 
| -      if (_compiler.options.hasIncrementalSupport &&
 | 
| -          !alreadyPopulated.add(cls)) {
 | 
| +      if (cacheStrategy.hasIncrementalSupport && !alreadyPopulated.add(cls)) {
 | 
|          return;
 | 
|        }
 | 
|        assert(cls.isDeclaration);
 | 
| @@ -1027,9 +1040,10 @@ class WorldImpl implements ClosedWorld, ClosedWorldRefiner, OpenWorld {
 | 
|      // classes: if the superclass of these classes require RTI, then
 | 
|      // they also need RTI, so that a constructor passes the type
 | 
|      // variables to the super constructor.
 | 
| -    _compiler.resolverWorld.forEachInstantiatedClass(addSubtypes);
 | 
| +    resolverWorld.forEachInstantiatedClass(addSubtypes);
 | 
|  
 | 
|      _closed = true;
 | 
| +    _commonMasks = new CommonMasks(this);
 | 
|      return this;
 | 
|    }
 | 
|  
 | 
| @@ -1072,14 +1086,16 @@ class WorldImpl implements ClosedWorld, ClosedWorldRefiner, OpenWorld {
 | 
|    }
 | 
|  
 | 
|    Element locateSingleElement(Selector selector, TypeMask mask) {
 | 
| +    assert(isClosed);
 | 
|      mask ??= commonMasks.dynamicType;
 | 
| -    return mask.locateSingleElement(selector, _compiler);
 | 
| +    return mask.locateSingleElement(selector, this);
 | 
|    }
 | 
|  
 | 
|    TypeMask extendMaskIfReachesAll(Selector selector, TypeMask mask) {
 | 
| +    assert(isClosed);
 | 
|      bool canReachAll = true;
 | 
|      if (mask != null) {
 | 
| -      canReachAll = _compiler.enabledInvokeOn &&
 | 
| +      canReachAll = _backend.hasInvokeOnSupport &&
 | 
|            mask.needsNoSuchMethodHandling(selector, this);
 | 
|      }
 | 
|      return canReachAll ? commonMasks.dynamicType : mask;
 | 
| @@ -1107,8 +1123,8 @@ class WorldImpl implements ClosedWorld, ClosedWorldRefiner, OpenWorld {
 | 
|        return true;
 | 
|      }
 | 
|      if (element.isInstanceMember) {
 | 
| -      return !_compiler.resolverWorld.hasInvokedSetter(element, this) &&
 | 
| -          !_compiler.resolverWorld.fieldSetters.contains(element);
 | 
| +      return !resolverWorld.hasInvokedSetter(element, this) &&
 | 
| +          !resolverWorld.fieldSetters.contains(element);
 | 
|      }
 | 
|      return false;
 | 
|    }
 | 
| 
 |