| Index: pkg/compiler/lib/src/resolution/resolution.dart
 | 
| diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart
 | 
| index f628e839981195e2201b8f217f48b3ebd3f300a7..7caced4336d7fe673b798a00271febf588d65621 100644
 | 
| --- a/pkg/compiler/lib/src/resolution/resolution.dart
 | 
| +++ b/pkg/compiler/lib/src/resolution/resolution.dart
 | 
| @@ -7,62 +7,47 @@ library dart2js.resolution;
 | 
|  import 'dart:collection' show Queue;
 | 
|  
 | 
|  import '../common.dart';
 | 
| -import '../common/names.dart' show
 | 
| -    Identifiers;
 | 
| -import '../common/resolution.dart' show
 | 
| -    Feature,
 | 
| -    Parsing,
 | 
| -    Resolution,
 | 
| -    ResolutionImpact;
 | 
| -import '../common/tasks.dart' show
 | 
| -    CompilerTask,
 | 
| -    DeferredAction;
 | 
| -import '../compiler.dart' show
 | 
| -    Compiler;
 | 
| -import '../compile_time_constants.dart' show
 | 
| -    ConstantCompiler;
 | 
| -import '../constants/expressions.dart' show
 | 
| -    ConstantExpression,
 | 
| -    ConstantExpressionKind,
 | 
| -    ConstructedConstantExpression,
 | 
| -    ErroneousConstantExpression;
 | 
| -import '../constants/values.dart' show
 | 
| -    ConstantValue;
 | 
| -import '../core_types.dart' show
 | 
| -    CoreClasses,
 | 
| -    CoreTypes;
 | 
| +import '../common/names.dart' show Identifiers;
 | 
| +import '../common/resolution.dart'
 | 
| +    show Feature, Parsing, Resolution, ResolutionImpact;
 | 
| +import '../common/tasks.dart' show CompilerTask, DeferredAction;
 | 
| +import '../compiler.dart' show Compiler;
 | 
| +import '../compile_time_constants.dart' show ConstantCompiler;
 | 
| +import '../constants/expressions.dart'
 | 
| +    show
 | 
| +        ConstantExpression,
 | 
| +        ConstantExpressionKind,
 | 
| +        ConstructedConstantExpression,
 | 
| +        ErroneousConstantExpression;
 | 
| +import '../constants/values.dart' show ConstantValue;
 | 
| +import '../core_types.dart' show CoreClasses, CoreTypes;
 | 
|  import '../dart_types.dart';
 | 
|  import '../elements/elements.dart';
 | 
| -import '../elements/modelx.dart' show
 | 
| -    BaseClassElementX,
 | 
| -    BaseFunctionElementX,
 | 
| -    ConstructorElementX,
 | 
| -    FieldElementX,
 | 
| -    FunctionElementX,
 | 
| -    GetterElementX,
 | 
| -    MetadataAnnotationX,
 | 
| -    MixinApplicationElementX,
 | 
| -    ParameterMetadataAnnotation,
 | 
| -    SetterElementX,
 | 
| -    TypedefElementX;
 | 
| -import '../tokens/token.dart' show
 | 
| -    isBinaryOperator,
 | 
| -    isMinusOperator,
 | 
| -    isTernaryOperator,
 | 
| -    isUnaryOperator,
 | 
| -    isUserDefinableOperator;
 | 
| +import '../elements/modelx.dart'
 | 
| +    show
 | 
| +        BaseClassElementX,
 | 
| +        BaseFunctionElementX,
 | 
| +        ConstructorElementX,
 | 
| +        FieldElementX,
 | 
| +        FunctionElementX,
 | 
| +        GetterElementX,
 | 
| +        MetadataAnnotationX,
 | 
| +        MixinApplicationElementX,
 | 
| +        ParameterMetadataAnnotation,
 | 
| +        SetterElementX,
 | 
| +        TypedefElementX;
 | 
| +import '../tokens/token.dart'
 | 
| +    show
 | 
| +        isBinaryOperator,
 | 
| +        isMinusOperator,
 | 
| +        isTernaryOperator,
 | 
| +        isUnaryOperator,
 | 
| +        isUserDefinableOperator;
 | 
|  import '../tree/tree.dart';
 | 
| -import '../universe/call_structure.dart' show
 | 
| -    CallStructure;
 | 
| -import '../universe/use.dart' show
 | 
| -    StaticUse,
 | 
| -    TypeUse;
 | 
| -import '../universe/world_impact.dart' show
 | 
| -    WorldImpact;
 | 
| -import '../util/util.dart' show
 | 
| -    Link,
 | 
| -    LinkBuilder,
 | 
| -    Setlet;
 | 
| +import '../universe/call_structure.dart' show CallStructure;
 | 
| +import '../universe/use.dart' show StaticUse, TypeUse;
 | 
| +import '../universe/world_impact.dart' show WorldImpact;
 | 
| +import '../util/util.dart' show Link, LinkBuilder, Setlet;
 | 
|  
 | 
|  import 'class_hierarchy.dart';
 | 
|  import 'class_members.dart' show MembersCreator;
 | 
| @@ -128,13 +113,11 @@ class ResolverTask extends CompilerTask {
 | 
|      });
 | 
|    }
 | 
|  
 | 
| -  void resolveRedirectingConstructor(InitializerResolver resolver,
 | 
| -                                     Node node,
 | 
| -                                     FunctionElement constructor,
 | 
| -                                     FunctionElement redirection) {
 | 
| +  void resolveRedirectingConstructor(InitializerResolver resolver, Node node,
 | 
| +      FunctionElement constructor, FunctionElement redirection) {
 | 
|      assert(invariant(node, constructor.isImplementation,
 | 
|          message: 'Redirecting constructors must be resolved on implementation '
 | 
| -                 'elements.'));
 | 
| +            'elements.'));
 | 
|      Setlet<FunctionElement> seen = new Setlet<FunctionElement>();
 | 
|      seen.add(constructor);
 | 
|      while (redirection != null) {
 | 
| @@ -154,18 +137,17 @@ class ResolverTask extends CompilerTask {
 | 
|    }
 | 
|  
 | 
|    static void processAsyncMarker(Compiler compiler,
 | 
| -                                 BaseFunctionElementX element,
 | 
| -                                 ResolutionRegistry registry) {
 | 
| +      BaseFunctionElementX element, ResolutionRegistry registry) {
 | 
|      DiagnosticReporter reporter = compiler.reporter;
 | 
|      Resolution resolution = compiler.resolution;
 | 
|      CoreClasses coreClasses = compiler.coreClasses;
 | 
|      FunctionExpression functionExpression = element.node;
 | 
|      AsyncModifier asyncModifier = functionExpression.asyncModifier;
 | 
|      if (asyncModifier != null) {
 | 
| -
 | 
|        if (asyncModifier.isAsynchronous) {
 | 
|          element.asyncMarker = asyncModifier.isYielding
 | 
| -            ? AsyncMarker.ASYNC_STAR : AsyncMarker.ASYNC;
 | 
| +            ? AsyncMarker.ASYNC_STAR
 | 
| +            : AsyncMarker.ASYNC;
 | 
|        } else {
 | 
|          element.asyncMarker = AsyncMarker.SYNC_STAR;
 | 
|        }
 | 
| @@ -185,7 +167,6 @@ class ResolverTask extends CompilerTask {
 | 
|                asyncModifier,
 | 
|                MessageKind.ASYNC_MODIFIER_ON_SETTER,
 | 
|                {'modifier': element.asyncMarker});
 | 
| -
 | 
|          }
 | 
|          if (functionExpression.body.asReturn() != null &&
 | 
|              element.asyncMarker.isYielding) {
 | 
| @@ -196,18 +177,18 @@ class ResolverTask extends CompilerTask {
 | 
|          }
 | 
|        }
 | 
|        switch (element.asyncMarker) {
 | 
| -      case AsyncMarker.ASYNC:
 | 
| -        registry.registerFeature(Feature.ASYNC);
 | 
| -        coreClasses.futureClass.ensureResolved(resolution);
 | 
| -        break;
 | 
| -      case AsyncMarker.ASYNC_STAR:
 | 
| -        registry.registerFeature(Feature.ASYNC_STAR);
 | 
| -        coreClasses.streamClass.ensureResolved(resolution);
 | 
| -        break;
 | 
| -      case AsyncMarker.SYNC_STAR:
 | 
| -        registry.registerFeature(Feature.SYNC_STAR);
 | 
| -        coreClasses.iterableClass.ensureResolved(resolution);
 | 
| -        break;
 | 
| +        case AsyncMarker.ASYNC:
 | 
| +          registry.registerFeature(Feature.ASYNC);
 | 
| +          coreClasses.futureClass.ensureResolved(resolution);
 | 
| +          break;
 | 
| +        case AsyncMarker.ASYNC_STAR:
 | 
| +          registry.registerFeature(Feature.ASYNC_STAR);
 | 
| +          coreClasses.streamClass.ensureResolved(resolution);
 | 
| +          break;
 | 
| +        case AsyncMarker.SYNC_STAR:
 | 
| +          registry.registerFeature(Feature.SYNC_STAR);
 | 
| +          coreClasses.iterableClass.ensureResolved(resolution);
 | 
| +          break;
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| @@ -225,9 +206,7 @@ class ResolverTask extends CompilerTask {
 | 
|        FunctionElement element, FunctionExpression tree) {
 | 
|      return reporter.withCurrentElement(element, () {
 | 
|        if (element.isExternal && tree.hasBody) {
 | 
| -        reporter.reportErrorMessage(
 | 
| -            element,
 | 
| -            MessageKind.EXTERNAL_WITH_BODY,
 | 
| +        reporter.reportErrorMessage(element, MessageKind.EXTERNAL_WITH_BODY,
 | 
|              {'functionName': element.name});
 | 
|        }
 | 
|        if (element.isConstructor) {
 | 
| @@ -240,8 +219,7 @@ class ResolverTask extends CompilerTask {
 | 
|              reporter.reportErrorMessage(
 | 
|                  tree, MessageKind.CONST_CONSTRUCTOR_WITH_BODY);
 | 
|            } else if (!tree.isRedirectingFactory) {
 | 
| -            reporter.reportErrorMessage(
 | 
| -                tree, MessageKind.CONST_FACTORY);
 | 
| +            reporter.reportErrorMessage(tree, MessageKind.CONST_FACTORY);
 | 
|            }
 | 
|          }
 | 
|        }
 | 
| @@ -295,13 +273,11 @@ class ResolverTask extends CompilerTask {
 | 
|            element.isInstanceMember &&
 | 
|            element.name == Identifiers.noSuchMethod_ &&
 | 
|            _isNativeClassOrExtendsNativeClass(enclosingClass)) {
 | 
| -        reporter.reportErrorMessage(
 | 
| -            tree, MessageKind.NO_SUCH_METHOD_IN_NATIVE);
 | 
| +        reporter.reportErrorMessage(tree, MessageKind.NO_SUCH_METHOD_IN_NATIVE);
 | 
|        }
 | 
|  
 | 
|        return registry.worldImpact;
 | 
|      });
 | 
| -
 | 
|    }
 | 
|  
 | 
|    WorldImpact resolveMethodElement(FunctionElementX element) {
 | 
| @@ -312,7 +288,7 @@ class ResolverTask extends CompilerTask {
 | 
|          // should never be non-null, not even for constructors.
 | 
|          assert(invariant(element, element.isConstructor,
 | 
|              message: 'Non-constructor element $element '
 | 
| -                     'has already been analyzed.'));
 | 
| +                'has already been analyzed.'));
 | 
|          return const ResolutionImpact();
 | 
|        }
 | 
|        if (element.isSynthesized) {
 | 
| @@ -326,9 +302,8 @@ class ResolverTask extends CompilerTask {
 | 
|            // seeing this element.
 | 
|            element.computeType(resolution);
 | 
|            if (!target.isMalformed) {
 | 
| -            registry.registerStaticUse(
 | 
| -                new StaticUse.superConstructorInvoke(
 | 
| -                    target, CallStructure.NO_ARGS));
 | 
| +            registry.registerStaticUse(new StaticUse.superConstructorInvoke(
 | 
| +                target, CallStructure.NO_ARGS));
 | 
|            }
 | 
|            return registry.worldImpact;
 | 
|          } else {
 | 
| @@ -363,9 +338,8 @@ class ResolverTask extends CompilerTask {
 | 
|  
 | 
|    WorldImpact resolveField(FieldElementX element) {
 | 
|      VariableDefinitions tree = element.parseNode(parsing);
 | 
| -    if(element.modifiers.isStatic && element.isTopLevel) {
 | 
| -      reporter.reportErrorMessage(
 | 
| -          element.modifiers.getStatic(),
 | 
| +    if (element.modifiers.isStatic && element.isTopLevel) {
 | 
| +      reporter.reportErrorMessage(element.modifiers.getStatic(),
 | 
|            MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC);
 | 
|      }
 | 
|      ResolverVisitor visitor = visitorFor(element);
 | 
| @@ -424,8 +398,7 @@ class ResolverTask extends CompilerTask {
 | 
|    DartType resolveTypeAnnotation(Element element, TypeAnnotation annotation) {
 | 
|      DartType type = resolveReturnType(element, annotation);
 | 
|      if (type.isVoid) {
 | 
| -      reporter.reportErrorMessage(
 | 
| -          annotation, MessageKind.VOID_NOT_ALLOWED);
 | 
| +      reporter.reportErrorMessage(annotation, MessageKind.VOID_NOT_ALLOWED);
 | 
|      }
 | 
|      return type;
 | 
|    }
 | 
| @@ -440,8 +413,8 @@ class ResolverTask extends CompilerTask {
 | 
|      return result;
 | 
|    }
 | 
|  
 | 
| -  void resolveRedirectionChain(ConstructorElementX constructor,
 | 
| -                               Spannable node) {
 | 
| +  void resolveRedirectionChain(
 | 
| +      ConstructorElementX constructor, Spannable node) {
 | 
|      ConstructorElementX target = constructor;
 | 
|      InterfaceType targetType;
 | 
|      List<Element> seen = new List<Element>();
 | 
| @@ -453,7 +426,7 @@ class ResolverTask extends CompilerTask {
 | 
|          targetType = target.effectiveTargetType;
 | 
|          assert(invariant(target, targetType != null,
 | 
|              message: 'Redirection target type has not been computed for '
 | 
| -                     '$target'));
 | 
| +                '$target'));
 | 
|          target = target.effectiveTargetInternal;
 | 
|          break;
 | 
|        }
 | 
| @@ -521,14 +494,11 @@ class ResolverTask extends CompilerTask {
 | 
|        if (cls.supertypeLoadState == STATE_DONE) return;
 | 
|        if (cls.supertypeLoadState == STATE_STARTED) {
 | 
|          reporter.reportErrorMessage(
 | 
| -            from,
 | 
| -            MessageKind.CYCLIC_CLASS_HIERARCHY,
 | 
| -            {'className': cls.name});
 | 
| +            from, MessageKind.CYCLIC_CLASS_HIERARCHY, {'className': cls.name});
 | 
|          cls.supertypeLoadState = STATE_DONE;
 | 
|          cls.hasIncompleteHierarchy = true;
 | 
| -        cls.allSupertypesAndSelf =
 | 
| -            coreClasses.objectClass.allSupertypesAndSelf.extendClass(
 | 
| -                cls.computeType(resolution));
 | 
| +        cls.allSupertypesAndSelf = coreClasses.objectClass.allSupertypesAndSelf
 | 
| +            .extendClass(cls.computeType(resolution));
 | 
|          cls.supertype = cls.allSupertypes.head;
 | 
|          assert(invariant(from, cls.supertype != null,
 | 
|              message: 'Missing supertype on cyclic class $cls.'));
 | 
| @@ -538,8 +508,9 @@ class ResolverTask extends CompilerTask {
 | 
|        cls.supertypeLoadState = STATE_STARTED;
 | 
|        reporter.withCurrentElement(cls, () {
 | 
|          // TODO(ahe): Cache the node in cls.
 | 
| -        cls.parseNode(parsing).accept(
 | 
| -            new ClassSupertypeResolver(compiler, cls));
 | 
| +        cls
 | 
| +            .parseNode(parsing)
 | 
| +            .accept(new ClassSupertypeResolver(compiler, cls));
 | 
|          if (cls.supertypeLoadState != STATE_DONE) {
 | 
|            cls.supertypeLoadState = STATE_DONE;
 | 
|          }
 | 
| @@ -561,8 +532,8 @@ class ResolverTask extends CompilerTask {
 | 
|    /// [element] has been resolved.
 | 
|    // TODO(johnniwinther): Encapsulate this functionality in a
 | 
|    // 'TypeDeclarationResolver'.
 | 
| -  _resolveTypeDeclaration(TypeDeclarationElement element,
 | 
| -                          resolveTypeDeclaration()) {
 | 
| +  _resolveTypeDeclaration(
 | 
| +      TypeDeclarationElement element, resolveTypeDeclaration()) {
 | 
|      return reporter.withCurrentElement(element, () {
 | 
|        return measure(() {
 | 
|          TypeDeclarationElement previousResolvedTypeDeclaration =
 | 
| @@ -572,7 +543,8 @@ class ResolverTask extends CompilerTask {
 | 
|          if (previousResolvedTypeDeclaration == null) {
 | 
|            do {
 | 
|              while (!pendingClassesToBeResolved.isEmpty) {
 | 
| -              pendingClassesToBeResolved.removeFirst()
 | 
| +              pendingClassesToBeResolved
 | 
| +                  .removeFirst()
 | 
|                    .ensureResolved(resolution);
 | 
|              }
 | 
|              while (!pendingClassesToBePostProcessed.isEmpty) {
 | 
| @@ -618,27 +590,30 @@ class ResolverTask extends CompilerTask {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  void resolveClassInternal(BaseClassElementX element,
 | 
| -                            ResolutionRegistry registry) {
 | 
| +  void resolveClassInternal(
 | 
| +      BaseClassElementX element, ResolutionRegistry registry) {
 | 
|      if (!element.isPatch) {
 | 
| -      reporter.withCurrentElement(element, () => measure(() {
 | 
| -        assert(element.resolutionState == STATE_NOT_STARTED);
 | 
| -        element.resolutionState = STATE_STARTED;
 | 
| -        Node tree = element.parseNode(parsing);
 | 
| -        loadSupertypes(element, tree);
 | 
| -
 | 
| -        ClassResolverVisitor visitor =
 | 
| -            new ClassResolverVisitor(compiler, element, registry);
 | 
| -        visitor.visit(tree);
 | 
| -        element.resolutionState = STATE_DONE;
 | 
| -        compiler.onClassResolved(element);
 | 
| -        pendingClassesToBePostProcessed.add(element);
 | 
| -      }));
 | 
| +      reporter.withCurrentElement(
 | 
| +          element,
 | 
| +          () => measure(() {
 | 
| +                assert(element.resolutionState == STATE_NOT_STARTED);
 | 
| +                element.resolutionState = STATE_STARTED;
 | 
| +                Node tree = element.parseNode(parsing);
 | 
| +                loadSupertypes(element, tree);
 | 
| +
 | 
| +                ClassResolverVisitor visitor =
 | 
| +                    new ClassResolverVisitor(compiler, element, registry);
 | 
| +                visitor.visit(tree);
 | 
| +                element.resolutionState = STATE_DONE;
 | 
| +                compiler.onClassResolved(element);
 | 
| +                pendingClassesToBePostProcessed.add(element);
 | 
| +              }));
 | 
|        if (element.isPatched) {
 | 
|          // Ensure handling patch after origin.
 | 
|          element.patch.ensureResolved(resolution);
 | 
|        }
 | 
| -    } else { // Handle patch classes:
 | 
| +    } else {
 | 
| +      // Handle patch classes:
 | 
|        element.resolutionState = STATE_STARTED;
 | 
|        // Ensure handling origin before patch.
 | 
|        element.origin.ensureResolved(resolution);
 | 
| @@ -722,8 +697,7 @@ class ResolverTask extends CompilerTask {
 | 
|      // Check that we're not trying to use Object as a mixin.
 | 
|      if (mixin.superclass == null) {
 | 
|        reporter.reportErrorMessage(
 | 
| -          mixinApplication,
 | 
| -          MessageKind.ILLEGAL_MIXIN_OBJECT);
 | 
| +          mixinApplication, MessageKind.ILLEGAL_MIXIN_OBJECT);
 | 
|        // Avoid reporting additional errors for the Object class.
 | 
|        return;
 | 
|      }
 | 
| @@ -735,8 +709,7 @@ class ResolverTask extends CompilerTask {
 | 
|  
 | 
|      // Check that the mixed in class has Object as its superclass.
 | 
|      if (!mixin.superclass.isObject) {
 | 
| -      reporter.reportErrorMessage(
 | 
| -          mixin, MessageKind.ILLEGAL_MIXIN_SUPERCLASS);
 | 
| +      reporter.reportErrorMessage(mixin, MessageKind.ILLEGAL_MIXIN_SUPERCLASS);
 | 
|      }
 | 
|  
 | 
|      // Check that the mixed in class doesn't have any constructors and
 | 
| @@ -754,31 +727,25 @@ class ResolverTask extends CompilerTask {
 | 
|          // differently.
 | 
|          if (compiler.enqueuer.resolution.hasBeenProcessed(member)) {
 | 
|            checkMixinSuperUses(
 | 
| -              member.resolvedAst.elements,
 | 
| -              mixinApplication,
 | 
| -              mixin);
 | 
| +              member.resolvedAst.elements, mixinApplication, mixin);
 | 
|          }
 | 
|        }
 | 
|      });
 | 
|    }
 | 
|  
 | 
|    void checkMixinSuperUses(TreeElements resolutionTree,
 | 
| -                           MixinApplicationElement mixinApplication,
 | 
| -                           ClassElement mixin) {
 | 
| +      MixinApplicationElement mixinApplication, ClassElement mixin) {
 | 
|      // TODO(johnniwinther): Avoid the use of [TreeElements] here.
 | 
|      if (resolutionTree == null) return;
 | 
|      Iterable<SourceSpan> superUses = resolutionTree.superUses;
 | 
|      if (superUses.isEmpty) return;
 | 
| -    DiagnosticMessage error = reporter.createMessage(
 | 
| -        mixinApplication,
 | 
| -        MessageKind.ILLEGAL_MIXIN_WITH_SUPER,
 | 
| -        {'className': mixin.name});
 | 
| +    DiagnosticMessage error = reporter.createMessage(mixinApplication,
 | 
| +        MessageKind.ILLEGAL_MIXIN_WITH_SUPER, {'className': mixin.name});
 | 
|      // Show the user the problematic uses of 'super' in the mixin.
 | 
|      List<DiagnosticMessage> infos = <DiagnosticMessage>[];
 | 
|      for (SourceSpan use in superUses) {
 | 
| -      infos.add(reporter.createMessage(
 | 
| -          use,
 | 
| -          MessageKind.ILLEGAL_MIXIN_SUPER_USE));
 | 
| +      infos.add(
 | 
| +          reporter.createMessage(use, MessageKind.ILLEGAL_MIXIN_SUPER_USE));
 | 
|      }
 | 
|      reporter.reportError(error, infos);
 | 
|    }
 | 
| @@ -801,8 +768,7 @@ class ResolverTask extends CompilerTask {
 | 
|                member, MessageKind.ILLEGAL_FINAL_METHOD_MODIFIER);
 | 
|          }
 | 
|          if (member.isConstructor) {
 | 
| -          final mismatchedFlagsBits =
 | 
| -              member.modifiers.flags &
 | 
| +          final mismatchedFlagsBits = member.modifiers.flags &
 | 
|                (Modifiers.FLAG_STATIC | Modifiers.FLAG_ABSTRACT);
 | 
|            if (mismatchedFlagsBits != 0) {
 | 
|              final mismatchedFlags =
 | 
| @@ -830,8 +796,8 @@ class ResolverTask extends CompilerTask {
 | 
|        });
 | 
|      });
 | 
|      if (!constConstructors.isEmpty && !nonFinalInstanceFields.isEmpty) {
 | 
| -      Spannable span = constConstructors.length > 1
 | 
| -          ? cls : constConstructors[0];
 | 
| +      Spannable span =
 | 
| +          constConstructors.length > 1 ? cls : constConstructors[0];
 | 
|        DiagnosticMessage error = reporter.createMessage(
 | 
|            span,
 | 
|            MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS,
 | 
| @@ -839,15 +805,13 @@ class ResolverTask extends CompilerTask {
 | 
|        List<DiagnosticMessage> infos = <DiagnosticMessage>[];
 | 
|        if (constConstructors.length > 1) {
 | 
|          for (Element constructor in constConstructors) {
 | 
| -          infos.add(reporter.createMessage(
 | 
| -              constructor,
 | 
| +          infos.add(reporter.createMessage(constructor,
 | 
|                MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR));
 | 
|          }
 | 
|        }
 | 
|        for (Element field in nonFinalInstanceFields) {
 | 
|          infos.add(reporter.createMessage(
 | 
| -            field,
 | 
| -            MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD));
 | 
| +            field, MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD));
 | 
|        }
 | 
|        reporter.reportError(error, infos);
 | 
|      }
 | 
| @@ -863,12 +827,11 @@ class ResolverTask extends CompilerTask {
 | 
|      ClassElement classElement = member.enclosingClass;
 | 
|      Element lookupElement = classElement.lookupLocalMember(member.name);
 | 
|      if (lookupElement == null) {
 | 
| -      reporter.internalError(member,
 | 
| -          "No abstract field for accessor");
 | 
| +      reporter.internalError(member, "No abstract field for accessor");
 | 
|      } else if (!lookupElement.isAbstractField) {
 | 
|        if (lookupElement.isMalformed || lookupElement.isAmbiguous) return;
 | 
| -      reporter.internalError(member,
 | 
| -          "Inaccessible abstract field for accessor");
 | 
| +      reporter.internalError(
 | 
| +          member, "Inaccessible abstract field for accessor");
 | 
|      }
 | 
|      AbstractFieldElement field = lookupElement;
 | 
|  
 | 
| @@ -880,14 +843,10 @@ class ResolverTask extends CompilerTask {
 | 
|      int setterFlags = setter.modifiers.flags | Modifiers.FLAG_ABSTRACT;
 | 
|      if (getterFlags != setterFlags) {
 | 
|        final mismatchedFlags =
 | 
| -        new Modifiers.withFlags(null, getterFlags ^ setterFlags);
 | 
| -      reporter.reportWarningMessage(
 | 
| -          field.getter,
 | 
| -          MessageKind.GETTER_MISMATCH,
 | 
| +          new Modifiers.withFlags(null, getterFlags ^ setterFlags);
 | 
| +      reporter.reportWarningMessage(field.getter, MessageKind.GETTER_MISMATCH,
 | 
|            {'modifiers': mismatchedFlags});
 | 
| -      reporter.reportWarningMessage(
 | 
| -          field.setter,
 | 
| -          MessageKind.SETTER_MISMATCH,
 | 
| +      reporter.reportWarningMessage(field.setter, MessageKind.SETTER_MISMATCH,
 | 
|            {'modifiers': mismatchedFlags});
 | 
|      }
 | 
|    }
 | 
| @@ -921,8 +880,8 @@ class ResolverTask extends CompilerTask {
 | 
|        messageKind = MessageKind.TERNARY_OPERATOR_BAD_ARITY;
 | 
|        requiredParameterCount = 2;
 | 
|      } else {
 | 
| -      reporter.internalError(function,
 | 
| -          'Unexpected user defined operator $value');
 | 
| +      reporter.internalError(
 | 
| +          function, 'Unexpected user defined operator $value');
 | 
|      }
 | 
|      checkArity(function, requiredParameterCount, messageKind, isMinus);
 | 
|    }
 | 
| @@ -930,17 +889,14 @@ class ResolverTask extends CompilerTask {
 | 
|    void checkOverrideHashCode(FunctionElement operatorEquals) {
 | 
|      if (operatorEquals.isAbstract) return;
 | 
|      ClassElement cls = operatorEquals.enclosingClass;
 | 
| -    Element hashCodeImplementation =
 | 
| -        cls.lookupLocalMember('hashCode');
 | 
| +    Element hashCodeImplementation = cls.lookupLocalMember('hashCode');
 | 
|      if (hashCodeImplementation != null) return;
 | 
| -    reporter.reportHintMessage(
 | 
| -        operatorEquals, MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE,
 | 
| -        {'class': cls.name});
 | 
| +    reporter.reportHintMessage(operatorEquals,
 | 
| +        MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE, {'class': cls.name});
 | 
|    }
 | 
|  
 | 
| -  void checkArity(FunctionElement function,
 | 
| -                  int requiredParameterCount, MessageKind messageKind,
 | 
| -                  bool isMinus) {
 | 
| +  void checkArity(FunctionElement function, int requiredParameterCount,
 | 
| +      MessageKind messageKind, bool isMinus) {
 | 
|      FunctionExpression node = function.node;
 | 
|      FunctionSignature signature = function.functionSignature;
 | 
|      if (signature.requiredParameterCount != requiredParameterCount) {
 | 
| @@ -994,22 +950,18 @@ class ResolverTask extends CompilerTask {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  reportErrorWithContext(Element errorneousElement,
 | 
| -                         MessageKind errorMessage,
 | 
| -                         Element contextElement,
 | 
| -                         MessageKind contextMessage) {
 | 
| +  reportErrorWithContext(Element errorneousElement, MessageKind errorMessage,
 | 
| +      Element contextElement, MessageKind contextMessage) {
 | 
|      reporter.reportError(
 | 
| -        reporter.createMessage(
 | 
| -            errorneousElement,
 | 
| -            errorMessage,
 | 
| -            {'memberName': contextElement.name,
 | 
| -             'className': contextElement.enclosingClass.name}),
 | 
| +        reporter.createMessage(errorneousElement, errorMessage, {
 | 
| +          'memberName': contextElement.name,
 | 
| +          'className': contextElement.enclosingClass.name
 | 
| +        }),
 | 
|          <DiagnosticMessage>[
 | 
| -            reporter.createMessage(contextElement, contextMessage),
 | 
| +          reporter.createMessage(contextElement, contextMessage),
 | 
|          ]);
 | 
|    }
 | 
|  
 | 
| -
 | 
|    FunctionSignature resolveSignature(FunctionElementX element) {
 | 
|      MessageKind defaultValuesError = null;
 | 
|      if (element.isFactoryConstructor) {
 | 
| @@ -1021,7 +973,10 @@ class ResolverTask extends CompilerTask {
 | 
|      return reporter.withCurrentElement(element, () {
 | 
|        FunctionExpression node = element.parseNode(parsing);
 | 
|        return measure(() => SignatureResolver.analyze(
 | 
| -          compiler, node.parameters, node.returnType, element,
 | 
| +          compiler,
 | 
| +          node.parameters,
 | 
| +          node.returnType,
 | 
| +          element,
 | 
|            new ResolutionRegistry(compiler, _ensureTreeElements(element)),
 | 
|            defaultValuesError: defaultValuesError,
 | 
|            createRealParameters: true));
 | 
| @@ -1032,15 +987,15 @@ class ResolverTask extends CompilerTask {
 | 
|      if (element.isResolved) return const ResolutionImpact();
 | 
|      compiler.world.allTypedefs.add(element);
 | 
|      return _resolveTypeDeclaration(element, () {
 | 
| -      ResolutionRegistry registry = new ResolutionRegistry(
 | 
| -          compiler, _ensureTreeElements(element));
 | 
| +      ResolutionRegistry registry =
 | 
| +          new ResolutionRegistry(compiler, _ensureTreeElements(element));
 | 
|        return reporter.withCurrentElement(element, () {
 | 
|          return measure(() {
 | 
|            assert(element.resolutionState == STATE_NOT_STARTED);
 | 
|            element.resolutionState = STATE_STARTED;
 | 
|            Typedef node = element.parseNode(parsing);
 | 
|            TypedefResolverVisitor visitor =
 | 
| -            new TypedefResolverVisitor(compiler, element, registry);
 | 
| +              new TypedefResolverVisitor(compiler, element, registry);
 | 
|            visitor.visit(node);
 | 
|            element.resolutionState = STATE_DONE;
 | 
|            return registry.worldImpact;
 | 
| @@ -1050,61 +1005,65 @@ class ResolverTask extends CompilerTask {
 | 
|    }
 | 
|  
 | 
|    void resolveMetadataAnnotation(MetadataAnnotationX annotation) {
 | 
| -    reporter.withCurrentElement(annotation.annotatedElement, () => measure(() {
 | 
| -      assert(annotation.resolutionState == STATE_NOT_STARTED);
 | 
| -      annotation.resolutionState = STATE_STARTED;
 | 
| -
 | 
| -      Node node = annotation.parseNode(parsing);
 | 
| -      Element annotatedElement = annotation.annotatedElement;
 | 
| -      AnalyzableElement context = annotatedElement.analyzableElement;
 | 
| -      ClassElement classElement = annotatedElement.enclosingClass;
 | 
| -      if (classElement != null) {
 | 
| -        // The annotation is resolved in the scope of [classElement].
 | 
| -        classElement.ensureResolved(resolution);
 | 
| -      }
 | 
| -      assert(invariant(node, context != null,
 | 
| -          message: "No context found for metadata annotation "
 | 
| -                   "on $annotatedElement."));
 | 
| -      ResolverVisitor visitor = visitorFor(context, useEnclosingScope: true);
 | 
| -      ResolutionRegistry registry = visitor.registry;
 | 
| -      node.accept(visitor);
 | 
| -      // TODO(johnniwinther): Avoid passing the [TreeElements] to
 | 
| -      // [compileMetadata].
 | 
| -      ConstantExpression constant = constantCompiler.compileMetadata(
 | 
| -          annotation, node, registry.mapping);
 | 
| -      switch (constant.kind) {
 | 
| -        case ConstantExpressionKind.CONSTRUCTED:
 | 
| -          ConstructedConstantExpression constructedConstant = constant;
 | 
| -          if (constructedConstant.type.isGeneric) {
 | 
| -            // Const constructor calls cannot have type arguments.
 | 
| -            // TODO(24312): Remove this.
 | 
| -            reporter.reportErrorMessage(
 | 
| -                node, MessageKind.INVALID_METADATA_GENERIC);
 | 
| -            constant = new ErroneousConstantExpression();
 | 
| -          }
 | 
| -          break;
 | 
| -        case ConstantExpressionKind.VARIABLE:
 | 
| -        case ConstantExpressionKind.ERRONEOUS:
 | 
| -          break;
 | 
| -        default:
 | 
| -          reporter.reportErrorMessage(node, MessageKind.INVALID_METADATA);
 | 
| -          constant = new ErroneousConstantExpression();
 | 
| -          break;
 | 
| -      }
 | 
| -      annotation.constant = constant;
 | 
| -
 | 
| -      constantCompiler.evaluate(annotation.constant);
 | 
| -      // TODO(johnniwinther): Register the relation between the annotation
 | 
| -      // and the annotated element instead. This will allow the backend to
 | 
| -      // retrieve the backend constant and only register metadata on the
 | 
| -      // elements for which it is needed. (Issue 17732).
 | 
| -      registry.registerMetadataConstant(annotation);
 | 
| -      annotation.resolutionState = STATE_DONE;
 | 
| -    }));
 | 
| +    reporter.withCurrentElement(
 | 
| +        annotation.annotatedElement,
 | 
| +        () => measure(() {
 | 
| +              assert(annotation.resolutionState == STATE_NOT_STARTED);
 | 
| +              annotation.resolutionState = STATE_STARTED;
 | 
| +
 | 
| +              Node node = annotation.parseNode(parsing);
 | 
| +              Element annotatedElement = annotation.annotatedElement;
 | 
| +              AnalyzableElement context = annotatedElement.analyzableElement;
 | 
| +              ClassElement classElement = annotatedElement.enclosingClass;
 | 
| +              if (classElement != null) {
 | 
| +                // The annotation is resolved in the scope of [classElement].
 | 
| +                classElement.ensureResolved(resolution);
 | 
| +              }
 | 
| +              assert(invariant(node, context != null,
 | 
| +                  message: "No context found for metadata annotation "
 | 
| +                      "on $annotatedElement."));
 | 
| +              ResolverVisitor visitor =
 | 
| +                  visitorFor(context, useEnclosingScope: true);
 | 
| +              ResolutionRegistry registry = visitor.registry;
 | 
| +              node.accept(visitor);
 | 
| +              // TODO(johnniwinther): Avoid passing the [TreeElements] to
 | 
| +              // [compileMetadata].
 | 
| +              ConstantExpression constant = constantCompiler.compileMetadata(
 | 
| +                  annotation, node, registry.mapping);
 | 
| +              switch (constant.kind) {
 | 
| +                case ConstantExpressionKind.CONSTRUCTED:
 | 
| +                  ConstructedConstantExpression constructedConstant = constant;
 | 
| +                  if (constructedConstant.type.isGeneric) {
 | 
| +                    // Const constructor calls cannot have type arguments.
 | 
| +                    // TODO(24312): Remove this.
 | 
| +                    reporter.reportErrorMessage(
 | 
| +                        node, MessageKind.INVALID_METADATA_GENERIC);
 | 
| +                    constant = new ErroneousConstantExpression();
 | 
| +                  }
 | 
| +                  break;
 | 
| +                case ConstantExpressionKind.VARIABLE:
 | 
| +                case ConstantExpressionKind.ERRONEOUS:
 | 
| +                  break;
 | 
| +                default:
 | 
| +                  reporter.reportErrorMessage(
 | 
| +                      node, MessageKind.INVALID_METADATA);
 | 
| +                  constant = new ErroneousConstantExpression();
 | 
| +                  break;
 | 
| +              }
 | 
| +              annotation.constant = constant;
 | 
| +
 | 
| +              constantCompiler.evaluate(annotation.constant);
 | 
| +              // TODO(johnniwinther): Register the relation between the annotation
 | 
| +              // and the annotated element instead. This will allow the backend to
 | 
| +              // retrieve the backend constant and only register metadata on the
 | 
| +              // elements for which it is needed. (Issue 17732).
 | 
| +              registry.registerMetadataConstant(annotation);
 | 
| +              annotation.resolutionState = STATE_DONE;
 | 
| +            }));
 | 
|    }
 | 
|  
 | 
| -  List<MetadataAnnotation> resolveMetadata(Element element,
 | 
| -                                           VariableDefinitions node) {
 | 
| +  List<MetadataAnnotation> resolveMetadata(
 | 
| +      Element element, VariableDefinitions node) {
 | 
|      List<MetadataAnnotation> metadata = <MetadataAnnotation>[];
 | 
|      for (Metadata annotation in node.metadata.nodes) {
 | 
|        ParameterMetadataAnnotation metadataAnnotation =
 | 
| @@ -1129,7 +1088,7 @@ abstract class AnalyzableElementX implements AnalyzableElement {
 | 
|    bool get hasTreeElements => _treeElements != null;
 | 
|  
 | 
|    TreeElements get treeElements {
 | 
| -    assert(invariant(this, _treeElements !=null,
 | 
| +    assert(invariant(this, _treeElements != null,
 | 
|          message: "TreeElements have not been computed for $this."));
 | 
|      return _treeElements;
 | 
|    }
 | 
| 
 |