| Index: pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
 | 
| diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
 | 
| index e50a7d7ee1ea6f54ff82d02a251d4f9fe324cd21..f0290b08eb0f00bf4d22075fa22ada35ffdb951d 100644
 | 
| --- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
 | 
| +++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
 | 
| @@ -15,16 +15,8 @@ import '../../constants/values.dart'
 | 
|  import '../../common_elements.dart' show CommonElements, ElementEnvironment;
 | 
|  import '../../deferred_load.dart' show DeferredLoadTask, OutputUnit;
 | 
|  import '../../elements/elements.dart'
 | 
| -    show
 | 
| -        ClassElement,
 | 
| -        FieldElement,
 | 
| -        FunctionSignature,
 | 
| -        LibraryElement,
 | 
| -        MemberElement,
 | 
| -        MethodElement,
 | 
| -        ParameterElement;
 | 
| +    show ClassElement, FieldElement, LibraryElement, MethodElement;
 | 
|  import '../../elements/entities.dart';
 | 
| -import '../../elements/resolution_types.dart' show ResolutionDartType;
 | 
|  import '../../elements/types.dart';
 | 
|  import '../../js/js.dart' as js;
 | 
|  import '../../js_backend/backend.dart' show SuperMemberData;
 | 
| @@ -192,7 +184,7 @@ class ProgramBuilder {
 | 
|    ///
 | 
|    /// Also contains classes that are not tracked by the profile run (like
 | 
|    /// interceptors, ...).
 | 
| -  Set<ClassElement> _notSoftDeferred;
 | 
| +  Set<ClassEntity> _notSoftDeferred;
 | 
|  
 | 
|    Program buildProgram({bool storeFunctionTypesInMetadata: false}) {
 | 
|      collector.collect();
 | 
| @@ -326,16 +318,17 @@ class ProgramBuilder {
 | 
|  
 | 
|        String data = new File(allocatedClassesPath).readAsStringSync();
 | 
|        Set<String> allocatedClassesKeys = JSON.decode(data).keys.toSet();
 | 
| -      Set<ClassElement> allocatedClasses = new Set<ClassElement>();
 | 
| +      Set<ClassEntity> allocatedClasses = new Set<ClassEntity>();
 | 
|  
 | 
|        // Collects all super and mixin classes of a class.
 | 
| -      void collect(ClassElement element) {
 | 
| +      void collect(ClassEntity element) {
 | 
|          allocatedClasses.add(element);
 | 
| -        if (element.isMixinApplication) {
 | 
| +        if (_elementEnvironment.isMixinApplication(element)) {
 | 
|            collect(_elementEnvironment.getEffectiveMixinClass(element));
 | 
|          }
 | 
| -        if (element.superclass != null) {
 | 
| -          collect(element.superclass);
 | 
| +        ClassEntity superclass = _elementEnvironment.getSuperClass(element);
 | 
| +        if (superclass != null) {
 | 
| +          collect(superclass);
 | 
|          }
 | 
|        }
 | 
|  
 | 
| @@ -343,7 +336,7 @@ class ProgramBuilder {
 | 
|        // collect its dependencies (supers and mixins) and mark them as
 | 
|        // not-soft-deferrable.
 | 
|        collector.outputClassLists.forEach((_, List<ClassEntity> elements) {
 | 
| -        for (ClassElement element in elements) {
 | 
| +        for (ClassEntity element in elements) {
 | 
|            // TODO(29574): share the encoding of the element with the code
 | 
|            // that emits the profile-run.
 | 
|            var key = "${element.library.canonicalUri}:${element.name}";
 | 
| @@ -562,7 +555,7 @@ class ProgramBuilder {
 | 
|  
 | 
|              if (member.isFunction) {
 | 
|                MethodElement fn = member;
 | 
| -              functionType = fn.type;
 | 
| +              functionType = _elementEnvironment.getFunctionType(fn);
 | 
|              } else if (member.isGetter) {
 | 
|                if (_options.trustTypeAnnotations) {
 | 
|                  DartType returnType =
 | 
| @@ -786,7 +779,7 @@ class ProgramBuilder {
 | 
|        for (Field field in instanceFields) {
 | 
|          if (field.needsCheckedSetter) {
 | 
|            assert(!field.needsUncheckedSetter);
 | 
| -          FieldElement element = field.element;
 | 
| +          FieldEntity element = field.element;
 | 
|            js.Expression code = _generatedCode[element];
 | 
|            assert(code != null);
 | 
|            js.Name name = _namer.deriveSetterName(field.accessorName);
 | 
| @@ -863,23 +856,28 @@ class ProgramBuilder {
 | 
|          _closedWorld.getMightBePassedToApply(method);
 | 
|    }
 | 
|  
 | 
| -  /* Map | List */ _computeParameterDefaultValues(FunctionSignature signature) {
 | 
| +  /* Map | List */ _computeParameterDefaultValues(FunctionEntity method) {
 | 
|      var /* Map | List */ optionalParameterDefaultValues;
 | 
| -    if (signature.optionalParametersAreNamed) {
 | 
| +    ParameterStructure parameterStructure = method.parameterStructure;
 | 
| +    if (parameterStructure.namedParameters.isNotEmpty) {
 | 
|        optionalParameterDefaultValues = new Map<String, ConstantValue>();
 | 
| -      signature.forEachOptionalParameter((_parameter) {
 | 
| -        ParameterElement parameter = _parameter;
 | 
| -        ConstantValue def =
 | 
| -            _constantHandler.getConstantValue(parameter.constant);
 | 
| -        optionalParameterDefaultValues[parameter.name] = def;
 | 
| +      _worldBuilder.forEachParameter(method,
 | 
| +          (DartType type, String name, ConstantValue defaultValue) {
 | 
| +        if (parameterStructure.namedParameters.contains(name)) {
 | 
| +          assert(defaultValue != null);
 | 
| +          optionalParameterDefaultValues[name] = defaultValue;
 | 
| +        }
 | 
|        });
 | 
|      } else {
 | 
|        optionalParameterDefaultValues = <ConstantValue>[];
 | 
| -      signature.forEachOptionalParameter((_parameter) {
 | 
| -        ParameterElement parameter = _parameter;
 | 
| -        ConstantValue def =
 | 
| -            _constantHandler.getConstantValue(parameter.constant);
 | 
| -        optionalParameterDefaultValues.add(def);
 | 
| +      int index = 0;
 | 
| +      _worldBuilder.forEachParameter(method,
 | 
| +          (DartType type, String name, ConstantValue defaultValue) {
 | 
| +        if (index >= parameterStructure.requiredParameters) {
 | 
| +          assert(defaultValue != null);
 | 
| +          optionalParameterDefaultValues.add(defaultValue);
 | 
| +        }
 | 
| +        index++;
 | 
|        });
 | 
|      }
 | 
|      return optionalParameterDefaultValues;
 | 
| @@ -945,11 +943,10 @@ class ProgramBuilder {
 | 
|      var /* List | Map */ optionalParameterDefaultValues;
 | 
|      if (canBeApplied || canBeReflected) {
 | 
|        // TODO(redemption): Handle function entities.
 | 
| -      MethodElement method = element;
 | 
| -      FunctionSignature signature = method.functionSignature;
 | 
| -      requiredParameterCount = signature.requiredParameterCount;
 | 
| -      optionalParameterDefaultValues =
 | 
| -          _computeParameterDefaultValues(signature);
 | 
| +      FunctionEntity method = element;
 | 
| +      ParameterStructure parameterStructure = method.parameterStructure;
 | 
| +      requiredParameterCount = parameterStructure.requiredParameters;
 | 
| +      optionalParameterDefaultValues = _computeParameterDefaultValues(method);
 | 
|      }
 | 
|  
 | 
|      return new InstanceMethod(element, name, code,
 | 
| @@ -995,7 +992,7 @@ class ProgramBuilder {
 | 
|    /// Stub methods may have an element that can be used for code-size
 | 
|    /// attribution.
 | 
|    Method _buildStubMethod(js.Name name, js.Expression code,
 | 
| -      {MemberElement element}) {
 | 
| +      {MemberEntity element}) {
 | 
|      return new StubMethod(name, code, element: element);
 | 
|    }
 | 
|  
 | 
| @@ -1085,8 +1082,15 @@ class ProgramBuilder {
 | 
|            needsCheckedSetter));
 | 
|      }
 | 
|  
 | 
| -    FieldVisitor visitor = new FieldVisitor(_options, _elementEnvironment,
 | 
| -        _worldBuilder, _nativeData, _mirrorsData, _namer, _closedWorld);
 | 
| +    FieldVisitor visitor = new FieldVisitor(
 | 
| +        _options,
 | 
| +        _elementEnvironment,
 | 
| +        _commonElements,
 | 
| +        _worldBuilder,
 | 
| +        _nativeData,
 | 
| +        _mirrorsData,
 | 
| +        _namer,
 | 
| +        _closedWorld);
 | 
|      visitor.visitFields(visitField,
 | 
|          visitStatics: visitStatics, library: library, cls: cls);
 | 
|  
 | 
| @@ -1152,11 +1156,10 @@ class ProgramBuilder {
 | 
|      var /* List | Map */ optionalParameterDefaultValues;
 | 
|      if (canBeApplied || canBeReflected) {
 | 
|        // TODO(redemption): Support entities;
 | 
| -      MethodElement method = element;
 | 
| -      FunctionSignature signature = method.functionSignature;
 | 
| -      requiredParameterCount = signature.requiredParameterCount;
 | 
| -      optionalParameterDefaultValues =
 | 
| -          _computeParameterDefaultValues(signature);
 | 
| +      FunctionEntity method = element;
 | 
| +      ParameterStructure parameterStructure = method.parameterStructure;
 | 
| +      requiredParameterCount = parameterStructure.requiredParameters;
 | 
| +      optionalParameterDefaultValues = _computeParameterDefaultValues(method);
 | 
|      }
 | 
|  
 | 
|      // TODO(floitsch): we shouldn't update the registry in the middle of
 | 
| 
 |