| Index: pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
 | 
| diff --git a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
 | 
| index ccc115548367718c835645885dffcb82d77f120f..6a5d7f758df35298c5e19014f8e90bda047ca49f 100644
 | 
| --- a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
 | 
| +++ b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
 | 
| @@ -7,6 +7,7 @@ library inferrer_visitor;
 | 
|  import 'dart:collection' show IterableMixin;
 | 
|  
 | 
|  import '../common.dart';
 | 
| +import '../options.dart' show CompilerOptions;
 | 
|  import '../compiler.dart' show Compiler;
 | 
|  import '../constants/constant_system.dart';
 | 
|  import '../constants/expressions.dart';
 | 
| @@ -371,13 +372,16 @@ abstract class MinimalInferrerEngine<T> {
 | 
|     * Records that the variable [local] is being updated.
 | 
|     */
 | 
|    void recordLocalUpdate(Local local, T type);
 | 
| +
 | 
| +  /// The [ClosedWorld] on which inference reasoning is based.
 | 
| +  ClosedWorld get closedWorld;
 | 
|  }
 | 
|  
 | 
|  /**
 | 
|   * Placeholder for inferred types of local variables.
 | 
|   */
 | 
|  class LocalsHandler<T> {
 | 
| -  final Compiler compiler;
 | 
| +  final CompilerOptions options;
 | 
|    final TypeSystem<T> types;
 | 
|    final MinimalInferrerEngine<T> inferrer;
 | 
|    final VariableScope<T> locals;
 | 
| @@ -394,7 +398,7 @@ class LocalsHandler<T> {
 | 
|  
 | 
|    bool get inTryBlock => tryBlock != null;
 | 
|  
 | 
| -  LocalsHandler(this.inferrer, this.types, this.compiler, Node block,
 | 
| +  LocalsHandler(this.inferrer, this.types, this.options, Node block,
 | 
|        [this.fieldScope])
 | 
|        : locals = new VariableScope<T>(block),
 | 
|          captured = new Map<Local, Element>(),
 | 
| @@ -409,7 +413,7 @@ class LocalsHandler<T> {
 | 
|          capturedAndBoxed = other.capturedAndBoxed,
 | 
|          types = other.types,
 | 
|          inferrer = other.inferrer,
 | 
| -        compiler = other.compiler {
 | 
| +        options = other.options {
 | 
|      tryBlock = useOtherTryBlock ? other.tryBlock : this;
 | 
|    }
 | 
|  
 | 
| @@ -421,7 +425,7 @@ class LocalsHandler<T> {
 | 
|          tryBlock = other.tryBlock,
 | 
|          types = other.types,
 | 
|          inferrer = other.inferrer,
 | 
| -        compiler = other.compiler;
 | 
| +        options = other.options;
 | 
|  
 | 
|    LocalsHandler.topLevelCopyOf(LocalsHandler<T> other)
 | 
|        : locals = new VariableScope<T>.topLevelCopyOf(other.locals),
 | 
| @@ -431,7 +435,7 @@ class LocalsHandler<T> {
 | 
|          tryBlock = other.tryBlock,
 | 
|          types = other.types,
 | 
|          inferrer = other.inferrer,
 | 
| -        compiler = other.compiler;
 | 
| +        options = other.options;
 | 
|  
 | 
|    T use(Local local) {
 | 
|      if (capturedAndBoxed.containsKey(local)) {
 | 
| @@ -446,8 +450,7 @@ class LocalsHandler<T> {
 | 
|  
 | 
|    void update(LocalElement local, T type, Node node) {
 | 
|      assert(type != null);
 | 
| -    if (compiler.options.trustTypeAnnotations ||
 | 
| -        compiler.options.enableTypeAssertions) {
 | 
| +    if (options.trustTypeAnnotations || options.enableTypeAssertions) {
 | 
|        type = types.narrowType(type, local.type);
 | 
|      }
 | 
|      updateLocal() {
 | 
| @@ -746,12 +749,13 @@ abstract class InferrerVisitor<T, E extends MinimalInferrerEngine<T>>
 | 
|          analyzedElement.isGenerativeConstructor
 | 
|              ? new FieldInitializationScope<T>(types)
 | 
|              : null;
 | 
| -    locals = new LocalsHandler<T>(inferrer, types, compiler, node, fieldScope);
 | 
| +    locals = new LocalsHandler<T>(
 | 
| +        inferrer, types, compiler.options, node, fieldScope);
 | 
|    }
 | 
|  
 | 
|    DiagnosticReporter get reporter => compiler.reporter;
 | 
|  
 | 
| -  ClosedWorld get closedWorld => compiler.closedWorld;
 | 
| +  ClosedWorld get closedWorld => inferrer.closedWorld;
 | 
|  
 | 
|    @override
 | 
|    SemanticSendVisitor get sendVisitor => this;
 | 
| @@ -887,7 +891,7 @@ abstract class InferrerVisitor<T, E extends MinimalInferrerEngine<T>>
 | 
|      // TODO(kasperl): We should be able to tell that the type of a literal
 | 
|      // symbol is always a non-null exact symbol implementation -- not just
 | 
|      // any non-null subtype of the symbol interface.
 | 
| -    return types.nonNullSubtype(compiler.coreClasses.symbolClass);
 | 
| +    return types.nonNullSubtype(closedWorld.coreClasses.symbolClass);
 | 
|    }
 | 
|  
 | 
|    @override
 | 
| @@ -1038,7 +1042,7 @@ abstract class InferrerVisitor<T, E extends MinimalInferrerEngine<T>>
 | 
|            }
 | 
|          } else {
 | 
|            // Narrow the elements to a non-null type.
 | 
| -          DartType objectType = compiler.coreTypes.objectType;
 | 
| +          DartType objectType = closedWorld.coreTypes.objectType;
 | 
|            if (Elements.isLocal(receiverElement)) {
 | 
|              narrow(receiverElement, objectType, node);
 | 
|            }
 | 
| 
 |