Add ClosedWorld.elementEnvironment and remove Compiler.elementEnvironment

R=efortuna@google.com

Review-Url: https://codereview.chromium.org/2935063002 .
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index 586cddc..faf31fd 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -8,7 +8,7 @@
 import '../compile_time_constants.dart';
 import '../constants/expressions.dart' show ConstantExpression;
 import '../constants/values.dart' show ConstantValue;
-import '../common_elements.dart' show CommonElements;
+import '../common_elements.dart' show CommonElements, ElementEnvironment;
 import '../elements/resolution_types.dart' show ResolutionDartType, Types;
 import '../elements/elements.dart'
     show
@@ -122,6 +122,7 @@
 abstract class Resolution {
   ParsingContext get parsingContext;
   DiagnosticReporter get reporter;
+  ElementEnvironment get elementEnvironment;
   CommonElements get commonElements;
   Types get types;
   Target get target;
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 03168d0e..aa3a5ba 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -88,7 +88,6 @@
   DartTypes types;
   FrontendStrategy frontendStrategy;
   BackendStrategy backendStrategy;
-  ElementEnvironment _elementEnvironment;
   CompilerDiagnosticReporter _reporter;
   CompilerResolution _resolution;
   ParsingContext _parsingContext;
@@ -120,7 +119,6 @@
   FunctionEntity mainFunction;
 
   DiagnosticReporter get reporter => _reporter;
-  ElementEnvironment get elementEnvironment => _elementEnvironment;
   Resolution get resolution => _resolution;
   ParsingContext get parsingContext => _parsingContext;
 
@@ -200,7 +198,6 @@
         ? new KernelBackendStrategy(this)
         : new ElementBackendStrategy(this);
     _resolution = createResolution();
-    _elementEnvironment = frontendStrategy.elementEnvironment;
     types = new Types(_resolution);
 
     if (options.verbose) {
@@ -568,7 +565,8 @@
         }
         reporter.log('Resolving...');
 
-        processQueue(resolutionEnqueuer, mainFunction, libraryLoader.libraries,
+        processQueue(frontendStrategy.elementEnvironment, resolutionEnqueuer,
+            mainFunction, libraryLoader.libraries,
             onProgress: showResolutionProgress);
         backend.onResolutionEnd();
         resolutionEnqueuer.logSummary(reporter.log);
@@ -621,7 +619,8 @@
             codegenEnqueuer.applyImpact(computeImpactForLibrary(library));
           });
         }
-        processQueue(codegenEnqueuer, mainFunction, libraryLoader.libraries,
+        processQueue(closedWorld.elementEnvironment, codegenEnqueuer,
+            mainFunction, libraryLoader.libraries,
             onProgress: showCodegenProgress);
         codegenEnqueuer.logSummary(reporter.log);
 
@@ -744,8 +743,8 @@
     });
   }
 
-  void processQueue(Enqueuer enqueuer, FunctionEntity mainMethod,
-      Iterable<LibraryEntity> libraries,
+  void processQueue(ElementEnvironment elementEnvironment, Enqueuer enqueuer,
+      FunctionEntity mainMethod, Iterable<LibraryEntity> libraries,
       {void onProgress(Enqueuer enqueuer)}) {
     selfTask.measureSubtask("Compiler.processQueue", () {
       enqueuer.open(impactStrategy, mainMethod, libraries);
@@ -1296,6 +1295,10 @@
   ParsingContext get parsingContext => _compiler.parsingContext;
 
   @override
+  ElementEnvironment get elementEnvironment =>
+      _compiler.frontendStrategy.elementEnvironment;
+
+  @override
   CommonElements get commonElements =>
       _compiler.frontendStrategy.commonElements;
 
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 2817879..541cf9e 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -15,7 +15,7 @@
 import '../constants/constant_system.dart';
 import '../constants/expressions.dart';
 import '../constants/values.dart';
-import '../common_elements.dart' show CommonElements;
+import '../common_elements.dart' show CommonElements, ElementEnvironment;
 import '../deferred_load.dart' show DeferredLoadTask;
 import '../dump_info.dart' show DumpInfoTask;
 import '../elements/elements.dart';
@@ -452,8 +452,10 @@
       bool useNewSourceInfo: false,
       bool useKernel: false})
       : _rti = new RuntimeTypesImpl(
-            compiler.elementEnvironment, compiler.frontendStrategy.dartTypes),
-        optimizerHints = new OptimizerHintsForTests(compiler.elementEnvironment,
+            compiler.frontendStrategy.elementEnvironment,
+            compiler.frontendStrategy.dartTypes),
+        optimizerHints = new OptimizerHintsForTests(
+            compiler.frontendStrategy.elementEnvironment,
             compiler.frontendStrategy.commonElements),
         this.sourceInformationStrategy =
             compiler.backendStrategy.sourceInformationStrategy,
@@ -471,12 +473,14 @@
         new CodeEmitterTask(compiler, generateSourceMap, useStartupEmitter);
 
     _typeVariableResolutionAnalysis = new TypeVariableResolutionAnalysis(
-        compiler.elementEnvironment, impacts, _backendUsageBuilder);
+        compiler.frontendStrategy.elementEnvironment,
+        impacts,
+        _backendUsageBuilder);
     jsInteropAnalysis = new JsInteropAnalysis(this);
     _mirrorsResolutionAnalysis =
         compiler.frontendStrategy.createMirrorsResolutionAnalysis(this);
-    lookupMapResolutionAnalysis =
-        new LookupMapResolutionAnalysis(reporter, compiler.elementEnvironment);
+    lookupMapResolutionAnalysis = new LookupMapResolutionAnalysis(
+        reporter, compiler.frontendStrategy.elementEnvironment);
 
     noSuchMethodRegistry = new NoSuchMethodRegistry(
         commonElements, compiler.frontendStrategy.createNoSuchMethodResolver());
@@ -732,7 +736,7 @@
       ClosedWorld closedWorld, ClosedWorldRefiner closedWorldRefiner) {
     for (MemberEntity entity
         in compiler.enqueuer.resolution.processedEntities) {
-      processAnnotations(
+      processAnnotations(closedWorld.elementEnvironment,
           closedWorld.commonElements, entity, closedWorldRefiner);
     }
     mirrorsDataBuilder.computeMembersNeededForReflection(
@@ -781,12 +785,13 @@
 
   ResolutionEnqueuer createResolutionEnqueuer(
       CompilerTask task, Compiler compiler) {
+    ElementEnvironment elementEnvironment =
+        compiler.frontendStrategy.elementEnvironment;
     CommonElements commonElements = compiler.frontendStrategy.commonElements;
-    _nativeBasicData =
-        nativeBasicDataBuilder.close(compiler.elementEnvironment);
+    _nativeBasicData = nativeBasicDataBuilder.close(elementEnvironment);
     _nativeResolutionEnqueuer = new native.NativeResolutionEnqueuer(
         compiler.options,
-        compiler.elementEnvironment,
+        elementEnvironment,
         commonElements,
         compiler.frontendStrategy.dartTypes,
         _backendUsageBuilder,
@@ -794,13 +799,13 @@
     _nativeDataBuilder = new NativeDataBuilderImpl(nativeBasicData);
     _customElementsResolutionAnalysis = new CustomElementsResolutionAnalysis(
         constantSystem,
-        compiler.elementEnvironment,
+        elementEnvironment,
         commonElements,
         nativeBasicData,
         _backendUsageBuilder);
     impactTransformer = new JavaScriptImpactTransformer(
         compiler.options,
-        compiler.elementEnvironment,
+        elementEnvironment,
         commonElements,
         impacts,
         nativeBasicData,
@@ -811,7 +816,7 @@
         rtiNeedBuilder);
     InterceptorDataBuilder interceptorDataBuilder =
         new InterceptorDataBuilderImpl(
-            nativeBasicData, compiler.elementEnvironment, commonElements);
+            nativeBasicData, elementEnvironment, commonElements);
     return new ResolutionEnqueuer(
         task,
         compiler.options,
@@ -821,7 +826,7 @@
             : const TreeShakingEnqueuerStrategy(),
         new ResolutionEnqueuerListener(
             compiler.options,
-            compiler.elementEnvironment,
+            elementEnvironment,
             commonElements,
             impacts,
             nativeBasicData,
@@ -850,25 +855,23 @@
   /// Creates an [Enqueuer] for code generation specific to this backend.
   CodegenEnqueuer createCodegenEnqueuer(
       CompilerTask task, Compiler compiler, ClosedWorld closedWorld) {
+    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
     CommonElements commonElements = closedWorld.commonElements;
     _typeVariableCodegenAnalysis = new TypeVariableCodegenAnalysis(
-        compiler.elementEnvironment, this, commonElements, mirrorsData);
+        closedWorld.elementEnvironment, this, commonElements, mirrorsData);
     _lookupMapAnalysis = new LookupMapAnalysis(
         reporter,
         constantSystem,
         constants,
-        compiler.elementEnvironment,
+        elementEnvironment,
         commonElements,
         lookupMapResolutionAnalysis);
     _mirrorsCodegenAnalysis = mirrorsResolutionAnalysis.close();
     _customElementsCodegenAnalysis = new CustomElementsCodegenAnalysis(
-        constantSystem,
-        commonElements,
-        compiler.elementEnvironment,
-        nativeBasicData);
+        constantSystem, commonElements, elementEnvironment, nativeBasicData);
     _nativeCodegenEnqueuer = new native.NativeCodegenEnqueuer(
         compiler.options,
-        compiler.elementEnvironment,
+        elementEnvironment,
         commonElements,
         compiler.frontendStrategy.dartTypes,
         emitter,
@@ -882,7 +885,7 @@
             nativeBasicData, closedWorld, const TypeMaskStrategy()),
         compiler.backendStrategy.createCodegenWorkItemBuilder(closedWorld),
         new CodegenEnqueuerListener(
-            compiler.elementEnvironment,
+            elementEnvironment,
             commonElements,
             impacts,
             closedWorld.backendUsage,
@@ -1063,11 +1066,11 @@
     _namer = determineNamer(closedWorld, codegenWorldBuilder);
     tracer = new Tracer(closedWorld, namer, compiler);
     _rtiEncoder = _namer.rtiEncoder = new RuntimeTypesEncoderImpl(
-        namer, compiler.elementEnvironment, closedWorld.commonElements);
+        namer, closedWorld.elementEnvironment, closedWorld.commonElements);
     emitter.createEmitter(namer, closedWorld, codegenWorldBuilder);
     _codegenImpactTransformer = new CodegenImpactTransformer(
         compiler.options,
-        compiler.elementEnvironment,
+        closedWorld.elementEnvironment,
         closedWorld.commonElements,
         impacts,
         checkedModeHelpers,
@@ -1109,7 +1112,10 @@
   /// Process backend specific annotations.
   // TODO(johnniwinther): Merge this with [AnnotationProcessor] and use
   // [ElementEnvironment.getMemberMetadata] in [AnnotationProcessor].
-  void processAnnotations(CommonElements commonElements, MemberEntity element,
+  void processAnnotations(
+      ElementEnvironment elementEnvironment,
+      CommonElements commonElements,
+      MemberEntity element,
       ClosedWorldRefiner closedWorldRefiner) {
     if (element is MemberElement && element.isMalformed) {
       // Elements that are marked as malformed during parsing or resolution
@@ -1135,7 +1141,7 @@
     bool hasNoThrows = false;
     bool hasNoSideEffects = false;
     for (ConstantValue constantValue
-        in compiler.elementEnvironment.getMemberMetadata(method)) {
+        in elementEnvironment.getMemberMetadata(method)) {
       if (!constantValue.isConstructedObject) continue;
       ObjectConstantValue value = constantValue;
       ClassEntity cls = value.type.element;
diff --git a/pkg/compiler/lib/src/js_backend/element_strategy.dart b/pkg/compiler/lib/src/js_backend/element_strategy.dart
index b0c216f..cd014c8 100644
--- a/pkg/compiler/lib/src/js_backend/element_strategy.dart
+++ b/pkg/compiler/lib/src/js_backend/element_strategy.dart
@@ -50,7 +50,7 @@
       NativeBasicData nativeBasicData,
       ClosedWorld closedWorld,
       SelectorConstraintsStrategy selectorConstraintsStrategy) {
-    return new ElementCodegenWorldBuilderImpl(_compiler.elementEnvironment,
+    return new ElementCodegenWorldBuilderImpl(closedWorld.elementEnvironment,
         nativeBasicData, closedWorld, selectorConstraintsStrategy);
   }
 
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index f8ba32e..59c06ae 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -182,7 +182,7 @@
           backend.mirrorsData,
           backend.rtiEncoder);
       typeTestRegistry = new TypeTestRegistry(
-          codegenWorldBuilder, closedWorld, compiler.elementEnvironment);
+          codegenWorldBuilder, closedWorld, closedWorld.elementEnvironment);
     });
   }
 
@@ -192,7 +192,7 @@
       ProgramBuilder programBuilder = new ProgramBuilder(
           compiler.options,
           compiler.reporter,
-          compiler.elementEnvironment,
+          closedWorld.elementEnvironment,
           closedWorld.commonElements,
           compiler.types,
           compiler.deferredLoadTask,
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
index 7c5d36c..97d244e 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
@@ -31,7 +31,7 @@
       closedWorld.commonElements, namer, codegenWorldBuilder, closedWorld,
       enableMinification: compiler.options.enableMinification);
 
-  ElementEnvironment get _elementEnvironment => compiler.elementEnvironment;
+  ElementEnvironment get _elementEnvironment => closedWorld.elementEnvironment;
 
   /**
    * Documentation wanted -- johnniwinther
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index e387f11..33e986a 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -124,7 +124,7 @@
   NativeEmitter get nativeEmitter => task.nativeEmitter;
   TypeTestRegistry get typeTestRegistry => task.typeTestRegistry;
   CommonElements get commonElements => _closedWorld.commonElements;
-  ElementEnvironment get _elementEnvironment => compiler.elementEnvironment;
+  ElementEnvironment get _elementEnvironment => _closedWorld.elementEnvironment;
 
   // The full code that is written to each hunk part-file.
   Map<OutputUnit, CodeOutput> outputBuffers = new Map<OutputUnit, CodeOutput>();
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 3de8a1f..5b24580 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -44,7 +44,8 @@
 
 class JsClosedWorld extends ClosedWorldBase {
   JsClosedWorld(
-      {CommonElements commonElements,
+      {ElementEnvironment elementEnvironment,
+      CommonElements commonElements,
       ConstantSystem constantSystem,
       NativeData nativeData,
       InterceptorData interceptorData,
@@ -58,6 +59,7 @@
       Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
       Map<ClassEntity, ClassSet> classSets})
       : super(
+            elementEnvironment: elementEnvironment,
             commonElements: commonElements,
             constantSystem: constantSystem,
             nativeData: nativeData,
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 854dc17..e3ea086 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -89,6 +89,8 @@
     }, ClassHierarchyNode.ALL);
 
     return new JsClosedWorld(
+        // TODO(johnniwinther): Create a JsElementEnvironment.
+        elementEnvironment: closedWorld.elementEnvironment,
         commonElements: commonElements,
         constantSystem: const JavaScriptConstantSystem(),
         backendUsage: backendUsage,
@@ -129,7 +131,7 @@
       NativeBasicData nativeBasicData,
       ClosedWorld closedWorld,
       SelectorConstraintsStrategy selectorConstraintsStrategy) {
-    return new KernelCodegenWorldBuilder(_compiler.elementEnvironment,
+    return new KernelCodegenWorldBuilder(closedWorld.elementEnvironment,
         nativeBasicData, closedWorld, selectorConstraintsStrategy);
   }
 }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 2b52e87..07dc4f6 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1530,7 +1530,6 @@
 
 class KernelClosedWorld extends ClosedWorldBase {
   final KernelToElementMapImpl _elementMap;
-  final ElementEnvironment _elementEnvironment;
 
   KernelClosedWorld(this._elementMap,
       {ElementEnvironment elementEnvironment,
@@ -1547,8 +1546,8 @@
       Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses,
       Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
       Map<ClassEntity, ClassSet> classSets})
-      : this._elementEnvironment = elementEnvironment,
-        super(
+      : super(
+            elementEnvironment: elementEnvironment,
             commonElements: commonElements,
             constantSystem: constantSystem,
             nativeData: nativeData,
@@ -1617,14 +1616,14 @@
   @override
   bool hasElementIn(ClassEntity cls, Selector selector, Entity element) {
     while (cls != null) {
-      MemberEntity member = _elementEnvironment
+      MemberEntity member = elementEnvironment
           .lookupClassMember(cls, selector.name, setter: selector.isSetter);
       if (member != null &&
           (!selector.memberName.isPrivate ||
               member.library == selector.library)) {
         return member == element;
       }
-      cls = _elementEnvironment.getSuperClass(cls);
+      cls = elementEnvironment.getSuperClass(cls);
     }
     return false;
   }
diff --git a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
index 4b8ff75..c21184f 100644
--- a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
@@ -75,7 +75,7 @@
       NativeBasicData nativeBasicData,
       ClosedWorld closedWorld,
       SelectorConstraintsStrategy selectorConstraintsStrategy) {
-    return new KernelCodegenWorldBuilder(_compiler.elementEnvironment,
+    return new KernelCodegenWorldBuilder(closedWorld.elementEnvironment,
         nativeBasicData, closedWorld, selectorConstraintsStrategy);
   }
 
diff --git a/pkg/compiler/lib/src/native/resolver.dart b/pkg/compiler/lib/src/native/resolver.dart
index b8ef149..5f94465 100644
--- a/pkg/compiler/lib/src/native/resolver.dart
+++ b/pkg/compiler/lib/src/native/resolver.dart
@@ -217,7 +217,8 @@
 
   JavaScriptBackend get _backend => _compiler.backend;
   DiagnosticReporter get _reporter => _compiler.reporter;
-  ElementEnvironment get elementEnvironment => _compiler.elementEnvironment;
+  ElementEnvironment get elementEnvironment =>
+      _compiler.resolution.elementEnvironment;
   CommonElements get commonElements => _compiler.resolution.commonElements;
   NativeBasicData get nativeBasicData => _backend.nativeBasicData;
   NativeDataBuilder get nativeDataBuilder => _backend.nativeDataBuilder;
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index d883af3..fd75e20 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -141,7 +141,8 @@
   CommonElements get commonElements => _compiler.resolution.commonElements;
 
   @override
-  ElementEnvironment get elementEnvironment => _compiler.elementEnvironment;
+  ElementEnvironment get elementEnvironment =>
+      _compiler.resolution.elementEnvironment;
 
   MemberElement get currentMember => _resolvedAst.element;
 
diff --git a/pkg/compiler/lib/src/universe/element_world_builder.dart b/pkg/compiler/lib/src/universe/element_world_builder.dart
index 24c414a..6a0ac26 100644
--- a/pkg/compiler/lib/src/universe/element_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/element_world_builder.dart
@@ -21,7 +21,7 @@
       BackendUsageBuilder backendUsageBuilder,
       SelectorConstraintsStrategy selectorConstraintsStrategy)
       : super(
-            backend.compiler.elementEnvironment,
+            _resolution.elementEnvironment,
             _resolution.commonElements,
             backend.constantSystem,
             nativeBasicData,
@@ -173,6 +173,7 @@
         populateHierarchyNodes();
     _closed = true;
     return _closedWorldCache = new ClosedWorldImpl(
+        elementEnvironment: _elementEnvironment,
         commonElements: _commonElements,
         constantSystem: _constantSystem,
         nativeData: _nativeDataBuilder.close(),
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index e4d4c3a..f7f5120 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -7,7 +7,7 @@
 import 'closure.dart' show ClosureClassElement, SynthesizedCallMethodElementX;
 import 'common.dart';
 import 'constants/constant_system.dart';
-import 'common_elements.dart' show CommonElements;
+import 'common_elements.dart' show CommonElements, ElementEnvironment;
 import 'elements/entities.dart';
 import 'elements/elements.dart'
     show
@@ -48,6 +48,8 @@
 
   InterceptorData get interceptorData;
 
+  ElementEnvironment get elementEnvironment;
+
   CommonElements get commonElements;
 
   CommonMasks get commonMasks;
@@ -429,6 +431,7 @@
 
   CommonMasks _commonMasks;
 
+  final ElementEnvironment elementEnvironment;
   final CommonElements commonElements;
 
   // TODO(johnniwinther): Avoid this.
@@ -438,7 +441,8 @@
   final Set<ClassEntity> _implementedClasses;
 
   ClosedWorldBase(
-      {this.commonElements,
+      {this.elementEnvironment,
+      this.commonElements,
       this.constantSystem,
       this.nativeData,
       this.interceptorData,
@@ -1156,7 +1160,8 @@
 
 class ClosedWorldImpl extends ClosedWorldBase {
   ClosedWorldImpl(
-      {CommonElements commonElements,
+      {ElementEnvironment elementEnvironment,
+      CommonElements commonElements,
       ConstantSystem constantSystem,
       NativeData nativeData,
       InterceptorData interceptorData,
@@ -1170,6 +1175,7 @@
       Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
       Map<ClassEntity, ClassSet> classSets})
       : super(
+            elementEnvironment: elementEnvironment,
             commonElements: commonElements,
             constantSystem: constantSystem,
             nativeData: nativeData,
diff --git a/pkg/compiler/tool/perf.dart b/pkg/compiler/tool/perf.dart
index ff154bf..44d4f36 100644
--- a/pkg/compiler/tool/perf.dart
+++ b/pkg/compiler/tool/perf.dart
@@ -365,7 +365,8 @@
           resolveLibraryMetadata();
         }
         reporter.log('Resolving...');
-        processQueue(resolutionEnqueuer, mainFunction, libraryLoader.libraries);
+        processQueue(frontendStrategy.elementEnvironment, resolutionEnqueuer,
+            mainFunction, libraryLoader.libraries);
         resolutionEnqueuer.logSummary(reporter.log);
 
         (reporter as CompilerDiagnosticReporter)
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 33b7576..5cae225 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -78,7 +78,10 @@
     MethodElement element = mainApp.find(entry);
     if (element == null) return null;
     compiler.phase = Compiler.PHASE_RESOLVING;
-    compiler.processQueue(compiler.enqueuer.resolution, element,
+    compiler.processQueue(
+        compiler.frontendStrategy.elementEnvironment,
+        compiler.enqueuer.resolution,
+        element,
         compiler.libraryLoader.libraries);
     ResolutionWorkItem resolutionWork =
         new ResolutionWorkItem(compiler.resolution, element);
diff --git a/tests/compiler/dart2js/dill_loader_test.dart b/tests/compiler/dart2js/dill_loader_test.dart
index 2e7a8a4..f4d94ac 100644
--- a/tests/compiler/dart2js/dill_loader_test.dart
+++ b/tests/compiler/dart2js/dill_loader_test.dart
@@ -67,7 +67,8 @@
     Expect.equals(0, diagnostics.errors.length);
     Expect.equals(0, diagnostics.warnings.length);
 
-    ElementEnvironment environment = compiler.elementEnvironment;
+    ElementEnvironment environment =
+        compiler.frontendStrategy.elementEnvironment;
     LibraryEntity library = environment.lookupLibrary(uri);
     Expect.isNotNull(library);
     ClassEntity clss = environment.lookupClass(library, 'ListLiteralTest');
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index f1259cc..a7252ca 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_helper.dart
@@ -46,7 +46,7 @@
   expectedMap.forEach((Id id, String expected) {
     reportHere(
         compiler.reporter,
-        computeSpannable(compiler.elementEnvironment, mainUri, id),
+        computeSpannable(compiler.resolution.elementEnvironment, mainUri, id),
         'expected:${expected},actual:null');
   });
   Expect.isTrue(expectedMap.isEmpty, "Ids not found: $expectedMap.");
diff --git a/tests/compiler/dart2js/kernel/closed_world2_test.dart b/tests/compiler/dart2js/kernel/closed_world2_test.dart
index 0400cb5..7ea0ad9 100644
--- a/tests/compiler/dart2js/kernel/closed_world2_test.dart
+++ b/tests/compiler/dart2js/kernel/closed_world2_test.dart
@@ -124,7 +124,8 @@
       await analyzeOnly(entryPoint, memorySourceFiles, printSteps: true);
   Compiler compiler = compilers.a;
   compiler.resolutionWorldBuilder.closeWorld();
-  ElementEnvironment environment1 = compiler.elementEnvironment;
+  ElementEnvironment environment1 =
+      compiler.frontendStrategy.elementEnvironment;
 
   Compiler compiler2 = compilers.b;
   KernelFrontEndStrategy frontendStrategy = compiler2.frontendStrategy;
@@ -134,7 +135,8 @@
   KernelEquivalence equivalence = new KernelEquivalence(elementMap);
   TestStrategy strategy = equivalence.defaultStrategy;
 
-  ElementEnvironment environment2 = compiler2.elementEnvironment;
+  ElementEnvironment environment2 =
+      compiler2.frontendStrategy.elementEnvironment;
   checkElementEnvironment(environment1, environment2, strategy);
 
   ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution;
diff --git a/tests/compiler/dart2js/kernel/closed_world_test.dart b/tests/compiler/dart2js/kernel/closed_world_test.dart
index d8464ea..fc918140 100644
--- a/tests/compiler/dart2js/kernel/closed_world_test.dart
+++ b/tests/compiler/dart2js/kernel/closed_world_test.dart
@@ -112,8 +112,8 @@
             const OpenWorldStrategy()),
         new KernelTestWorkItemBuilder(compiler),
         'enqueuer from kernel');
-    ClosedWorld closedWorld = computeClosedWorld(
-        compiler.reporter, enqueuer, compiler.elementEnvironment);
+    ClosedWorld closedWorld = computeClosedWorld(compiler.reporter, enqueuer,
+        compiler.frontendStrategy.elementEnvironment);
     BackendUsage backendUsage = backendUsageBuilder.close();
     checkResolutionEnqueuers(
         backendUsage, backendUsage, compiler.enqueuer.resolution, enqueuer,
@@ -138,7 +138,7 @@
   InterceptorDataBuilder interceptorDataBuilder =
       new InterceptorDataBuilderImpl(
           backend.nativeBasicData,
-          compiler.elementEnvironment,
+          compiler.frontendStrategy.elementEnvironment,
           compiler.frontendStrategy.commonElements);
   ResolutionEnqueuerListener listener = new ResolutionEnqueuerListener(
       compiler.options,
diff --git a/tests/compiler/dart2js/no_such_method_enabled_test.dart b/tests/compiler/dart2js/no_such_method_enabled_test.dart
index 713271c..286635d 100644
--- a/tests/compiler/dart2js/no_such_method_enabled_test.dart
+++ b/tests/compiler/dart2js/no_such_method_enabled_test.dart
@@ -268,11 +268,12 @@
 }
 
 checkTest(Compiler compiler, NoSuchMethodTest test, {bool testComplexReturns}) {
-  ElementEnvironment elementEnvironment = compiler.elementEnvironment;
+  ElementEnvironment elementEnvironment =
+      compiler.frontendStrategy.elementEnvironment;
   NoSuchMethodRegistry registry = compiler.backend.noSuchMethodRegistry;
   NoSuchMethodResolver resolver = registry.internalResolverForTesting;
   FunctionEntity ObjectNSM = elementEnvironment.lookupClassMember(
-      compiler.resolution.commonElements.objectClass, 'noSuchMethod');
+      compiler.frontendStrategy.commonElements.objectClass, 'noSuchMethod');
   ClosedWorld closedWorld =
       compiler.resolutionWorldBuilder.closedWorldForTesting;
 
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 08af18e..f16e481 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -256,7 +256,7 @@
     MethodElement funElement = fooElement.lookupLocalMember("foo");
     compiler.enqueuer.resolution.applyImpact(new WorldImpactBuilderImpl()
       ..registerStaticUse(new StaticUse.implicitInvoke(funElement)));
-    compiler.processQueue(
+    compiler.processQueue(compiler.frontendStrategy.elementEnvironment,
         compiler.enqueuer.resolution, null, compiler.libraryLoader.libraries);
     DiagnosticCollector collector = compiler.diagnosticCollector;
     Expect.equals(0, collector.warnings.length);
diff --git a/tests/compiler/dart2js/type_representation_test.dart b/tests/compiler/dart2js/type_representation_test.dart
index f0c6aa1..0a345a6 100644
--- a/tests/compiler/dart2js/type_representation_test.dart
+++ b/tests/compiler/dart2js/type_representation_test.dart
@@ -50,7 +50,7 @@
         env.compiler.backend.onCodegenStart(
             closedWorld,
             new ElementCodegenWorldBuilderImpl(
-                env.compiler.elementEnvironment,
+                closedWorld.elementEnvironment,
                 env.compiler.backend.nativeBasicData,
                 closedWorld,
                 const TypeMaskStrategy()));